Matlab主成分分析(特征值顺序)

时间:2011-02-14 10:59:16

标签: matlab linear-algebra pca eigenvalue

我想使用Matlab的“princomp”函数,但是这个函数给出了一个排序数组中的特征值。这样我就无法找出哪个列对应哪个特征值。 对于Matlab,

m = [1,2,3;4,5,6;7,8,9];
[pc,score,latent] = princomp(m);

相同
m = [2,1,3;5,4,6;8,7,9];
[pc,score,latent] = princomp(m);

也就是说,交换前两列不会改变任何东西。潜在的结果(特征值)将是:(27,0,0) 信息(特征值对应于哪个原始(输入)列)丢失。 有没有办法告诉matlab不要对特征值进行排序?

2 个答案:

答案 0 :(得分:16)

使用PCA,返回的每个主要组件将是原始列/维度的线性组合。也许一个例子可能会消除你的任何误解。

让我们考虑包含150个实例和4个维度的Fisher-Iris数据集,并对数据应用PCA。为了使事情更容易理解,我首先将数据置于零中心,然后再调用PCA函数:

load fisheriris
X = bsxfun(@minus, meas, mean(meas));    %# so that mean(X) is the zero vector

[PC score latent] = princomp(X);

让我们看一下第一个返回的主成分(PC矩阵的第一列):

>> PC(:,1)
      0.36139
    -0.084523
      0.85667
      0.35829

这表示为原始尺寸的线性组合,即:

PC1 =  0.36139*dim1 + -0.084523*dim2 + 0.85667*dim3 + 0.35829*dim4

因此,为了在由主成分构成的新坐标系中表达相同的数据,新的第一维应该是根据上述公式的原始线的组合。

我们可以简单地将此计算为X*PC,这正是PRINCOMP(score)的第二个输出中返回的内容,以确认此尝试:

>> all(all( abs(X*PC - score) < 1e-10 ))
    1

最后,每个主成分的重要性可以通过它解释的数据的方差来确定。这是由PRINCOMP的第三个输出(latent)返回的。


我们可以在不使用PRINCOMP的情况下自行计算数据的PCA:

[V E] = eig( cov(X) );
[E order] = sort(diag(E), 'descend');
V = V(:,order);

协方差矩阵V的特征向量是主要成分(与PC相同,尽管符号可以反转),相应的特征值E代表方差量解释(与latent相同)。注意,习惯上用它们的特征值对主成分进行排序。和以前一样,为了在新坐标中表达数据,我们只需计算X*V(如果您确保匹配符号,则应与上面的score相同)

答案 1 :(得分:0)

“信息(特征值对应于哪个原始(输入)列)丢失。”

由于每个主成分是所有输入变量的线性函数,因此每个主成分(特征向量,特征值)对应于原始输入列的全部。忽略可能在PCA中任意改变的符号,重新排序输入变量不会改变PCA结果。

“有没有办法告诉matlab不要对特征值进行排序?”

我对此表示怀疑:PCA(和一般的特征分析)通常按方差对结果进行排序,但我注意到princomp()从最大方差到最小方差排序,而eig()则排序相反。

有关使用MATLAB插图的PCA的更多说明,有或没有princomp(),请参阅:

Principal Components Analysis