我在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与沿着主成分轴投影原始数据是相同的。
发布于 2015-06-13 00:26:19
Xc*coeff不等于score,因为您的X不居中。
作为documentation says,
通过减去列平均值,
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。)
https://stackoverflow.com/questions/30771308
复制相似问题