%基於主成分分析的特征提取代碼 %讀取原始數據,調用三個子函數,輸出主成分分析結果 %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 ,呂大蘭