如何使用简化数据 - 主成分分析的输出

时间:2016-08-01 02:55:04

标签: matlab image-processing pca dimensionality-reduction

我发现很难将理论与实施联系起来。我很感激帮助知道我的理解是错误的。

符号 - 粗体大写的矩阵和粗体字母的小写字母

**X** <code>n</code>观察数据集,每个<code>d</code>个变量。因此,给定这些观察到的<code>d</code>维数据向量,<code>m</code>维主轴是 **w**<sub>j</sub> ,对于 {sub> j 中的 {1,...,m} 其中<code>m</code>是目标维度。

观测数据矩阵的<code>m</code>主成分是 **Y = X W** ,其中matrix **Y** in ℝ<sup> n x m</sup> ,matrix { {3}} 和矩阵 **X** in ℝ<sup> n x d</sup>

**W** in ℝ<sup> d x m</sup>的列形成**W**要素的正交基础,输出 <code>m</code> 是主要的组件投影,最小化平方重建误差:

**y**<sub>n</sub>
∑<sub>n</sub> ||**x**<sub>n</sub> - **x̂**<sub>n</sub>||<sup>2</sup> 的最佳重建由 **x**<sub>n</sub> 给出。

数据模型是

X(i,j) = A(i,:)*S(:,j) + noise

其中PCA应在X上完成以获得输出S. S必须等于Y.

问题1:简化数据Y不等于模型中使用的S.我的理解在哪里错了?

问题2:如何重建以使错误最小化?

请帮忙。谢谢。

   clear all
clc
n1 = 5; %d dimension
n2 = 500; % number of examples

ncomp = 2; % target reduced dimension
%Generating data according to the model
% X(i,j) = A(i,:)*S(:,j) + noise
Ar = orth(randn(n1,ncomp))*diag(ncomp:-1:1);
T = 1:n2;
%generating synthetic data from a dynamical model
S = [ exp(-T/150).*cos( 2*pi*T/50 )
       exp(-T/150).*sin( 2*pi*T/50 ) ];
% Normalizing to zero mean and unit variance
S = ( S - repmat( mean(S,2), 1, n2 ) );
S = S ./ repmat( sqrt( mean( Sr.^2, 2 ) ), 1, n2 );
Xr = Ar * S;
Xrnoise = Xr + 0.2 * randn(n1,n2);

h1 = tsplot(S);


    X = Xrnoise;

XX = X';
[pc, ~] = eigs(cov(XX), ncomp);
Y = XX*pc;

更新[8月10日]

根据答案,这里是完整的代码

 clear all
clc
n1 = 5; %d dimension
n2 = 500; % number of examples

ncomp = 2; % target reduced dimension
%Generating data according to the model
% X(i,j) = A(i,:)*S(:,j) + noise
Ar = orth(randn(n1,ncomp))*diag(ncomp:-1:1);
T = 1:n2;
%generating synthetic data from a dynamical model
S = [ exp(-T/150).*cos( 2*pi*T/50 )
       exp(-T/150).*sin( 2*pi*T/50 ) ];
% Normalizing to zero mean and unit variance
S = ( S - repmat( mean(S,2), 1, n2 ) );
S = S ./ repmat( sqrt( mean( S.^2, 2 ) ), 1, n2 );
Xr = Ar * S;
Xrnoise = Xr + 0.2 * randn(n1,n2);

    X = Xrnoise;

XX = X';
[pc, ~] = eigs(cov(XX), ncomp);
Y = XX*pc; %Y are the principal components of X' 
%what you call pc is misleading, these are not the principal components
%These Y columns are orthogonal, and should span the same space 
%as S approximatively indeed (not exactly, since you introduced noise).

%If you want to reconstruct 
%the original data can be retrieved by projecting 
%the principal components back on the original space like this:
Xrnoise_reconstructed = Y*pc';

%Then, you still need to project it through 
%to the S space, if you want to reconstruct S
S_reconstruct = Ar'*Xrnoise_reconstructed';


plot(1:length(S_reconstruct),S_reconstruct,'r')
hold on
 plot(1:length(S),S)

情节是**x̂**<sub>n</sub> = **W*y**<sub>n</sub>,与答案中显示的情节非常不同。只有S的一个组件与S_reconstructed的组件完全匹配。不应该重建源输入S的整个原始二维空间吗? 即使我切断了噪音,也只是S的一个组成部分被精确重建。

4 个答案:

答案 0 :(得分:3)

我看到没有人回答你的问题,所以这里有:

您在Y中计算的内容是X'的主要组成部分(您所谓的pc具有误导性,这些不是主要组成部分)。这些Y列是正交的,并且应该与S大致相同的空间(不完全相同,因为您引入了噪声)。

如果你想重建Xrnoise,你必须查看理论(例如here)并正确应用它:原始数据可以通过将主要组件投射回原始空间来检索这样:

Xrnoise_reconstructed = Y*pc'

然后,如果你想重建pinv(Ar)*Xrnoise_reconstructed,你还需要通过S进行转换。

很适合我: Xrnoise and reconstruction

回复更新[8月10日] :( 8月12日编辑)

您的Ar矩阵未定义标准正交基础,因此,转置Ar'不是反向转换。我提供的早期答案是错误的。上面已经纠正了答案。

答案 1 :(得分:2)

你的理解是对的。有人使用PCA的原因之一是减少数据的维数。第一主成分在X列的所有归一化线性组合中具有最大的样本方差。第二主成分具有与下一主成分正交的最大方差等。

然后可以在数据集上执行PCA,并决定切断数据的最后一个主成分或几个最后主成分。这样做是为了减少维数诅咒的影响。维数的诅咒是一个术语,用于指出任何一组向量在相对高维空间中稀疏的事实。相反,这意味着您需要一个荒谬的数据量才能在相当高的维度数据集上形成任何模型,例如文本文档的单词直方图,可能有数万个维度。

实际上,通过PCA降低维度会删除强相关的组件。例如,让我们看一下图片:

Cameraman

如您所见,大多数值几乎相同,强烈相关。您可以通过删除最后的主要组件来融合其中一些相关像素。这将通过删除图像中的一些信息来减少图像的维度,打包它。

没有神奇的方法来确定我所知道的主要组件的最佳数量或最佳重建。

答案 2 :(得分:2)

如果我不是数学上的严谨,请原谅我。 如果我们看一下等式:X = A * S我们可以说我们正在获取一些二维数据,并将它映射到5维空间中的二维子空间。 A是这个二维子空间的基础。

当我们解决X的PCA问题并查看PC(主要组件)时,我们看到两个大的eignvector(它们对应于两个最大的eignvalues)跨越了与A相同的子空间。 (多个A&#39; * PC,看到前三个小的eignvector得到0,这意味着向量与A正交,只有两个最大的,我们得到的值不同于0)。

所以我认为我们为这个二维空间得到不同基础的原因是因为X = A * S可以是某些A1和S1的产物,也适用于其他一些A2和S2,我们仍然会得到X = A1 * S1 = A2 * S2。 PCA为我们提供的是一个特定的基础,可以最大化每个维度的方差。

那么如何解决你的问题呢?我可以看到你选择了一些指数时间sin和cos作为测试数据,所以我认为你正在处理特定类型的数据。我不是信号处理专家,但看看MUSIC算法。

答案 3 :(得分:-3)

您可以使用统计工具箱中的pca功能。

coeff = pca(X)

documentation开始,coeff的每一列都包含一个主要成分的系数。因此,您可以通过乘以X重建观察到的数据coeff,例如X*coeff