function [V,S,E]=princa(X) [m,n]=size(X); %計算矩陣的行m和列n %-------------第一步:標准化矩陣-----------------% mv=mean(X); %計算各變量的均值 st=std(X); %計算各變量的標准差 X=(X-repmat(mv,m,1))./repmat(st,m,1); %標准化矩陣X %-------------第二步:計算相關系數矩陣-----------------% % R1=X'*X/(m-1); %方法一:協方差矩陣計算公式 % R2=cov(X); %方法二:協方差矩陣計算函數 R=corrcoef(X); %方法三:相關系數矩陣函數 %-------------第三步:計算特征向量和特征值-----------------% [V,D]=eig(R); %計算矩陣R的特征向量矩陣V和特征值矩陣D,特征值由小到大 V=(rot90(V))'; %將特征向量矩陣V從大到小排序 D=rot90(rot90(D)); %將特征值矩陣由大到小排序 E=diag(D); %將特征值矩陣轉換為特征值向量 %-------------第四步:計算貢獻率和累計貢獻率-----------------% ratio=0; %累計貢獻率 for k=1:n r=E(k)/sum(E); %第k主成份貢獻率 ratio=ratio+r; %累計貢獻率 if(ratio>=0.9) %取累計貢獻率大於等於90%的主成分 break; end end %-------------第五步:計算得分-----------------% S=X*V;
如果要求主成分分析,用matlab自帶一個的函數(princomp)就行。Princomp調用如下:
[COEFF,SCORE,latent,tsquare] = princomp(zscore(X))
zscore(X)是對矩陣X進行標准化操作。
COEFF是X矩陣所對應的協方差陣的所有特征向量組成的矩陣,即變換矩陣或稱投影矩陣,每列對應一個特征值的特征向量,列的排列順序是按特征值的大小遞減排序
相當於上面程序中的V,它表示的是主成分的系數。
SCORE是對主成分的打分,也就是說原X矩陣在主成分空間的表示。每行對應樣本觀測值,每列對應一個主成份(變量),它的行和列的數目和X的行列數目相同。(相當於上面程序中的S)
latent是一個向量,它是X所對應的協方差矩陣的特征值向量。 (相當於程序中的E)
特征值與分數之間的關系:latent=diag(cov(SCORE));
tsquare是表示對每個樣本點Hotelling的T方統計量
計算PCA的時候,如果直接有現成的協方差陣,用函數pcacov來計算。