如何使用缩减后的数据——主成分分析的输出

How to use the reduced data - the output of principal component analysis

我发现很难 link 理论与实施。如果能帮助我了解我的理解错误之处,我将不胜感激。

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

is a dataset on observations, each of variables. So, given these observed -dimensional data vectors, the -dimensional principal axes are , for in where 为目标维度

principal components of the observed data matrix would be where matrix , matrix , and matrix

form an orthogonal basis for the features and the output 的列是最小化平方重构误差的主成分投影:


以及 is given by .

的最优重构

数据模型是

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

其中应该对 X 进行 PCA 以获得输出 S。S 必须等于 Y。

问题一:缩减后的数据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)

情节是,与答案中显示的情节有很大不同。 S 中只有一个分量与 S_reconstructed 的分量完全匹配。源输入S的整个原始2维space不应该重构吗? 即使我切断噪音,也只有 S 的一个分量被完全重建。

您可以使用统计工具箱中的 pca 函数。

coeff = pca(X)

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

你的理解很正确。有人使用 PCA 的原因之一是降低数据的维数。在 X 的列的所有归一化线性组合中,第一个主成分具有最大样本方差。第二个主成分具有最大方差,与下一个主成分正交,依此类推。

然后可能会在数据集上进行 PCA,并决定切断数据的最后一个主成分或几个最后的主成分。这样做是为了减少维数灾难的影响。维数灾难是一个术语,用来指出任何一组向量在相对较高的维度上都是稀疏的space。相反,这意味着您需要大量的数据才能在相当高维的数据集上形成任何模型,例如可能具有数万维的文本文档的单词直方图。

实际上,PCA 的降维删除了强相关的组件。比如我们来看一张图:

如您所见,大多数值几乎相同,相关性很强。您可以通过移除最后的主要成分来融合其中一些相关像素。这将通过删除图像中的一些信息来降低图像的维度,将其打包。

据我所知,没有什么神奇的方法可以确定主成分的最佳数量或最佳重构。

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

的某个基础

当我们解决 X 的 PCA 问题并查看 PC(主成分)时,我们看到两个大的特征向量(对应于两个最大的特征值)跨越与 A 相同的子space。 (乘以 A'*PC 并看到对于前三个小的 eignvector 我们得到 0,这意味着这些向量与 A 正交并且只有两个最大的我们得到不同于 0 的值)。

所以我认为我们为这个二维得到不同基数的原因 space 是因为 X=A*S 可以是某些 A1 和 S1 的乘积,也可以是其他一些 A2 和 S2 的乘积我们仍然会得到 X=A1*S1=A2*S2。 PCA 给我们的是一个特定的基础,可以最大化每个维度的方差。

那么你遇到的问题是怎么解决的呢?我可以看到您选择了一些指数乘以 sin 和 cos 作为测试数据,所以我认为您正在处理一种特定类型的数据。本人不是信号处理专家,看一下MUSIC算法

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

您在 Y 中计算的是 X' 的主成分(您所说的 pc 具有误导性,这些不是主成分)。这些 Y 列是正交的,并且应该大致跨越与 S 相同的 space (不完全是,因为你引入了噪声)。

如果要重构Xrnoise,必须看理论(例如here)并正确应用:可以通过将主成分投影回原始数据来检索原始数据space 像这样:

Xrnoise_reconstructed = Y*pc'

那么,如果要重构S,还需要通过pinv(Ar)*Xrnoise_reconstructed进行改造。

非常适合我:

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

您的 Ar 矩阵没有定义正交基,因此,转置 Ar' 不是反向变换。因此,我之前提供的答案是错误的。答案已在上面更正。