使用Matlab中不同函数计算的主成分

3

我正在尝试理解Matlab中的主成分分析。

似乎有至少3个不同的函数可以实现它。

以下是我的一些问题:

  1. 我是否正确地使用了只有一个特征向量(对应于最大特征值的那个)来创建近似的 x 值?我认为是这样的吗?

  2. 为什么 PCV,它们都是用于 (x'x) 的载荷,呈现出不同的形式?列顺序被反转了,因为 eig 没有按照最大值优先顺序排序特征值,但它们为什么是彼此的负数?

  3. 为什么 eig 值没有按照与第一列相对应的最大特征值的特征向量的顺序排列?

  4. 使用下面的代码,当使用 svdeig 时,我回到了输入矩阵 x,但 princomp 的结果似乎完全不同?我需要做什么才能使 princomp 与另外两个函数匹配?

代码:

x=[1 2;3 4;5 6;7 8 ]

econFlag=0;

[U,sigma,V] = svd(x,econFlag);%[U,sigma,coeff] = svd(z,econFlag);

U1=U(:,1);
V1=V(:,1);
sigma_partial=sigma(1,1);

score1=U*sigma;
test1=score1*V';

score_partial=U1*sigma_partial;
test1_partial=score_partial*V1';



[PC, D] = eig(x'*x)

 score2=x*PC;
test2=score2*PC';

PC1=PC(:,2);
score2_partial=x*PC1;
 test2_partial=score2_partial*PC1';

[o1 o2 o3]=princomp(x);

1
你的代码缺少尝试从“princomp”的输出中重构“x”的部分。 - A. Donda
1
相关:https://dev59.com/1G855IYBdhLWcg3wViu3#4403027,https://dev59.com/wE7Sa4cB1Zd3GeqP7N2L#3181851 - Amro
1
请参考以下关于特征向量顺序的问题:https://dev59.com/-WYr5IYBdhLWcg3waJZT - Amro
1个回答

5
  1. 是的。根据svd的文档,输出S的对角线元素按降序排列。但是,eig的输出D没有这样的保证。

  2. 特征向量和奇异向量没有定义的符号。如果a是一个特征向量,那么-a也是。

  3. 我经常想同样的问题。TMW的懒惰?优化,因为排序是一个额外的步骤,并不是每个人都需要排序?

  4. princomp在计算主成分之前会将输入数据居中。这是有道理的,因为通常PCA是针对协方差矩阵计算的,而x' * x的特征向量只有在x是无偏时才与协方差矩阵的特征向量相同。


我会通过转换到协方差矩阵(居中数据)的特征向量基来计算PCA,但是将此变换应用于原始(未居中)数据。这允许捕获尽可能多的方差,同时使用尽可能少的主成分来恢复所有原始数据:

[V, D] = eig(cov(x));

score = x * V;
test = score * V';

testx在数值误差范围内相同。

为了方便地选择具有最大方差的组件,让我们自己解决缺乏排序的问题:

[V, D] = eig(cov(x));
[D, ind] = sort(diag(D), 'descend');
V = V(:, ind);

score = x * V;
test = score * V';

仅使用最强的主成分重构信号:

test_partial = score(:, 1) * V(:, 1)';

回应Amro的评论:当然也可以先从输入数据中删除平均值,然后转换这些“居中”数据。在这种情况下,为了完美重建原始数据,需要重新添加平均值。上述给出的计算PCA的方法是Neil H. Timm所描述的方法,《应用多元分析》,Springer 2002年,第446页:

给定一个具有平均值mu和协方差矩阵Sigma的全秩p观察向量Y,PCA的目标是创建一个称为主成分(PCs)或主变量的新变量集。 主成分是向量Y的变量的线性组合,它们是不相关的,使得第j个成分的方差最大。

Timm随后将“标准化成分”定义为那些已从居中数据计算出并被其特征值(即方差)的平方根除以的成分。即,“标准化主成分”具有均值0和方差1。


1
当您对特征向量进行排序时,我认为您应该只重新排列列,如 V = V(:,ind)。 正如您提到的那样,在将其乘以 V 计算 score 之前,必须将 x 居中为零。 - Amro
1
你对第一件事是正确的,感谢指出!但我不同意第二点。如果主成分应该提供最大方差分解,则eig的参数需要从居中数据计算。但正如我所写的那样,我认为最好在非居中数据上计算“得分”,或者实际上是主成分,因为只有这样才能完美地恢复原始数据,即只有这样PCA才能提供分解。 - A. Donda
1
好的,如果您想要从截断的特征向量集合中重构原始数据,那么在乘法运算后必须将均值向量加回去。我的意思只是想获得一个类似于princomp函数返回的“scores”变量。 - Amro
1
@Amro,你可以用任何一种方式来做。我更喜欢这种方式,因为它更简单,不需要对手段进行任何特殊处理。我的方法也是Neil H. Timm在他的书《应用多元分析》(Springer 2002年,第446页)中描述的方法。现在我包含了参考文献。 - A. Donda
2
@Bazman:是的。与eig不同,svd在文档中明确说明奇异值以递减顺序返回。 - Amro
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接