matlab 中自帶的函數就不必懷疑。
princomp:principal componet analysis (PCA).
[COEFF,SCORE,latent,tsquare]=princomp(X);
參數:
%%%%%%%%%%%%%%%%%%
INPUT: X是數據:n*p,其中n代表樣本個數,p代表特征維數
%%%%%%%%%%%%%%%%%%
OUTPUT:
COEFF: 協方差 p*p,投影矩陣
SCORE:投影之后的數據。如果樣本個數<=特征維數,有一個有意思的
現象:SCORE(:,n:p), latent(n:p)都為零。為何呢?請以兩個
數據點為例。即n=2,p=3;當選擇了一個投影軸之后,再選一個
正交的抽,發現無論怎么選,它們投影之后都會重疊,即0。
latent:計算完之后並不是主成分歸一化的權重。如果需要,用下面代碼:
cumsum(latent)./sum(latent);
很注意的是:
訓練樣本計算出來了協方差矩陣。如果來了一個測試集,我們不能再去重新
計算一個協方差矩陣。因為那樣會使訓練集和測試集投影到不同的空間上,
最終導致特征空間不一致,訓練出來的參數毫無意義。