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 ,吕大兰