zoukankan      html  css  js  c++  java
  • 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('标准化结果如下:
    ')
    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('相关系数矩阵:
    ')      
    std=corrcoef(vector);          %求解相关系数矩阵(各个特证间的相关程度)
    fprintf('特征向量(vec)及特征值(val):
    ')
    [vec,val]=eig(std);            %求解特征向量和特征值
    newval=diag(val);              %特征值组成对角矩阵
    [y,i]=sort(newval);            %特征值从大到小排序
    fprintf('特征根排序:
    ')
    for z=1:length(y)
        newy(z)=y(length(y)+1-z);
    end         
    fprintf('%g
    ',newy)
    rate=y/sum(y);
    fprintf('
     贡献率:
    ')
    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
    
    ',length(newi));
    fprintf('主成分在和:
    ')
    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('原始数据用主成分表示:
    ')
    alldata_pca=v1*result     %坐标变换(原始数据用主成分表示)
    end

    参考资料:

    https://wenku.baidu.com/view/239e277af02d2af90242a8956bec0975f465a484.html ,吕大兰

  • 相关阅读:
    为php5.6.30安装redis扩展
    Laravel利用pusher推送消息
    php闭包使用例子
    利用反射给类中方法加钩子
    mysql删除重复记录
    DB门面,查询构建器,Eloquent ORM三者的CURD
    Laravel5.1之表单验证
    服务提供者及门面
    批量搜索并替换内容
    Laravel之Elixir
  • 原文地址:https://www.cnblogs.com/feynmania/p/12893808.html
Copyright © 2011-2022 走看看