2015-06-11 64 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代替。)