主成分分析matlab代碼實現

方法一:
1:用zscore函數對原始數據S進行標準化。
2:用cov函數求出標準化後的數據的協方差。
3:求出此協方差的特徵向量與特徵根(eig函數)。
4:將產生的特徵向量依據特徵根大小從大到小進行排列(即將特徵向量按列倒序)。
5:依據需求取出倒序後的向量的前幾列(一般根據特徵根來算貢獻率,使得累計貢獻率大於85%),組成新的矩陣T
6:做S*T得到分析後的新的數據。
7:依據特徵根算貢獻率,並繪圖。
代碼如下:

X=load('shuju.txt')
z=zscore(X)               %數據標準化
M=cov(z)                  %協方差
[V,D]=eig(M);             %求出協方差矩陣的特徵向量、特徵根
d=diag(D);                %取出特徵根矩陣列向量(提取出每一主成分的貢獻率)
eig1=sort(d,'descend')      %將貢獻率按從大到小元素排列
v=fliplr(V)                %依照D重新排列特徵向量
S=0;
i=0;
while S/sum(eig1)<0.85
    i=i+1;
    S=S+eig1(i);
end                         %求出累積貢獻率大於85%的主成分
NEW=z*v(:,1:i)              %輸出產生的新座標下的數據
W=100*eig1/sum(eig1)
figure(1)
pareto(W);                  %畫出貢獻率的直方圖
 

方法二:
1:用zscore函數對原始數據S進行標準化,(同上)。
2:利用matlab自帶的princomp函數直接求得其特徵向量,新座標下的數據,特徵根(並且已經排列好了)。
3:選擇恰當的前幾項主成分與標準化後的數據相乘。得到在新座標下的數據。
4:如方法一,利用特徵根算貢獻率。
代碼如下:

X=load('shuju.txt')
x=zscore(X)                       %標準化
[coef,score,eig,t]=princomp(x);   %利用princomp處理矩陣
t                                 %每一組數據在新座標下到原點的距離
s=0;
i=1;
while s/sum(eig)<0.85
    s=s+eig(i);
    i=i+1;
end                              %獲得累計貢獻率大於85%幾組數據
NEW=x*coef(:,1:i-1)              %輸出新的數據
figure
pareto(eig/sum(eig));          %輸出貢獻率直方圖
figure(2)
plot(eig,'r+');
hold on
plot(eig,'b-');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章