1

我在 MATLAB 中执行以下操作:

>> X = [ 123 982 123 ; 434 233 842; 143 239 583; 733 292 503]

X =

123   982   123
434   233   842
143   239   583
733   292   503

[coeff,score] = princomp(X)

coeff =

-0.3714    0.9202    0.1241
 0.7330    0.2085    0.6475
-0.5700   -0.3314    0.7519


score =

 709.3366   26.4384   30.9912
-364.9469  -81.8490  125.1814
-104.8637 -262.5228 -101.7805
-239.5260  317.9334  -54.3921

>> X * coeff

ans =

 603.9913  277.1477  743.6166
-470.2922  168.8604  837.8069
-210.2090  -11.8134  610.8450
-344.8714  568.6428  658.2333

为什么 score = X * coeff 不是?

我相信 X * coeff 与沿主成分轴投影原始数据相同。

4

1 回答 1

0

Xc*coeff不等于,score因为您的 X 未居中。

正如文件所说

princomp 通过减去列均值使 X 居中

以下是居中的作用:

[m n] = size(X);
Xc = X - kron(ones(m,1),sum(X,1))/m;

输出:

Xc =

 -235.2500  545.5000 -389.7500
   75.7500 -203.5000  329.2500
 -215.2500 -197.5000   70.2500
  374.7500 -144.5000   -9.7500

请注意

  • [coeff,score] = princomp(Xc)返回与 完全相同的结果[coeff,score] = princomp(X)

  • Xc*coeff确实等于score

使用时,princomp您不必在将数据提供给 princomp 之前将其居中,因为例程会为您执行此操作,并且可能以更有效的方式进行。

(顺便说一句:princomp已弃用;建议pca改用。)

于 2015-06-12T16:26:19.080 回答