-3

我想使用 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不要对特征值进行排序?

4

2 回答 2

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上面一样,如果你确保匹配符号)

于 2011-02-14T22:41:55.243 回答
0

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

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

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

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

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

主成分分析

于 2011-02-24T11:18:33.153 回答