我在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
为什么得分= X * coeff?
我相信X * coeff与沿主要分量轴投影原始数据相同。
答案 0 :(得分: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
。)