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

 

posted @ 2020-05-15 11:24  Feynmania  阅读(1053)  评论(0编辑  收藏  举报