2015-06-11 33 views
1

我在MATLAB如下:在Matlab中使用princomp()?

>> 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 * _系数?

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

+0

我相信这是因为该系数不正交。查看http://www.mathworks.com/help/stats/feature-transformation.html#f75476获取更多信息 – Esteban

+0

那么我应该在计算投影之前理想地使它们正交吗? – Sykalen

回答

0

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代替。)