matlab主成分分析PCA


%基於主成分分析的特征提取代碼
%讀取原始數據,調用三個子函數,輸出主成分分析結果
%command
%[fid,vector,v1,result]=cwprint('data.txt',145,55)
function [fid,vector,v1,result]=cwprint(filename,a,b)
fid=fopen(filename,'r')
vector=fscanf(fid,'%g',[a,b]);
fprintf('標准化結果如下:\n')
v1=cwstd(vector)
result=cwfac(v1);   
%result為因子載荷矩陣;最終主成分變量解釋通過載荷矩陣分析得出;

%對原始數據進行標准化
function std=cwstd(vector)   %矩陣標准化:消除量綱影響
cwsum=sum(vector,1);
[a,b]=size(vector);
for i=1:a
    for j=1:b
        std(i,j)=vector(i,j)/cwsum(j);
    end
end

%主成分分析
%cwfac()函數作用:
%計算相關系數矩陣
%計算特征值和特征向量
%對主成分進行排序
%計算個特征值貢獻率及累計貢獻率(由於限定主成分個數<10,所以設置為累計貢獻率>80%%挑選主成分,輸出主成分個數;
%計算主成分載荷(主成分和原特征之間的關系:后續分析主成分含義的依據)
function result=cwfac(vector)
fprintf('相關系數矩陣:\n')      
std=corrcoef(vector);          %求解相關系數矩陣(各個特證間的相關程度)
fprintf('特征向量(vec)及特征值(val):\n')
[vec,val]=eig(std);            %求解特征向量和特征值
newval=diag(val);              %特征值組成對角矩陣
[y,i]=sort(newval);            %特征值從大到小排序
fprintf('特征根排序:\n')
for z=1:length(y)
    newy(z)=y(length(y)+1-z);
end         
fprintf('%g\n',newy)
rate=y/sum(y);
fprintf('\n 貢獻率:\n')
newrate=newy/sum(newy)
sumrate=0;
newi=[];
for k=length(y):-1:1
    sumrate=sumrate+rate(k);
    newi(length(y)+1-k)=i(k);
    if sumrate>0.8               %設定貢獻率;>0.85為11個主成分
        break;
    end
end
fprintf('主成分數:%g\n\n',length(newi));
fprintf('主成分在和:\n')
for p=1:length(newi)
    for q=1:length(y)
        result(q,p)=sqrt(newval(newi(p)))*vec(q,newi(p));
    end
end
disp(result)
    
%坐標變換,得到回歸用的輸入數據:即:
%將原始數據用主成分(線性無關)表示,作為回歸的輸入。
function alldata_pca =x2z(v1,result)  
fprintf('原始數據用主成分表示:\n')
alldata_pca=v1*result     %坐標變換(原始數據用主成分表示)
end

 

參考資料:

https://wenku.baidu.com/view/239e277af02d2af90242a8956bec0975f465a484.html ,呂大蘭

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM