zoukankan      html  css  js  c++  java
  • 主成分分析(多元分析方法之一)

            主成分分析的主要目的是希望用较少的变量去解释原来资料中的大部分变异,将我们手中许多相关性很高的变量转化成彼此独立或者不相关的变量。通常是选出比原始变量个数少,能解释大部分资料中的变异的几个新变量,即所谓主成分,并用以解释资料的综合性指标。主成分分析实际上是一种降维方法。

           也是为了方便自己,举例。 

           举例:下面是y和x1、x2、x3、x4之间的关系数据共13组,见表。对数据实施标准化得到数据矩阵A,则A‘*A/12就是样本相关系数阵。

           

          计算的Matlab程序如下:

    clc,clear;
    load ch.txt;  %把原始数据的x1,x2,x3,x4,y的数据保存在纯文本文件ch.txt中
    [m,n]=size(ch); 
    x0=ch(:,[1:n-1]);y0=ch(:,n);
    hg1=[ones(m,1),x0]y0;  %计算普通最小二乘法回归系数
    hg1=hg1'                %变成行向量显示回归系数,其中第一个分量是常数项,其他按x1,x2,...,xn排序
    fprintf('对Hald数据做线性回归的经验回归方程:
    '); %开始显示普通最小二乘法回归结果
    fprintf('y=%f',hg1(1));
    for i=2:n
        if hg1(i)>0
            fprintf('+%f*x%d',hg1(i),i-1);
        else
            fprintf('%f*x%d',hg1(i),i-1);
        end
    end
    fprintf('
    ');
    r=corrcoef(x0);  %计算相关系数
    xd=zscore(x0);   %对设计矩阵进行标准化处理
    yd=zscore(y0);   %对y0进行标准化处理
    [vec1,lamda,rate]=pcacov(r);
    f=repmat(sign(sum(vec1)),size(vec1,1),1);
    vec2=vec1.*f;
    contr=cumsum(rate)/sum(rate);
    df=xd*vec2;
    
    num=input('请选择主成分的个数:');
    fprintf('主成分回归方程系数:
    ');
    hg21=df(:,1:num)yd
    fprintf('化成标准量的回归方程系数:
    ');
    hg22=vec2(:,1:num)*hg21
    hg23=[mean(y0)-std(y0)*mean(x0)./std(x0)*hg22,std(y0)*hg22'./std(x0)];
    
    fprintf('恢复到原始的自变量,得到的主成分回归分析方程:
    ');
    fprintf('y=%f',hg23(1));
    for i=2:n  %开始显示主成分回归结果
        if hg23(i)>0
            fprintf('+%f*x%d',hg23(i),i-1);
        else
            fprintf('%f*x%d',hg23(i),i-1);
        end
    end
    fprintf('
    ');
    %下面计算两种回归分析的剩余标准差
    rmse1=sqrt(sum((hg1(1)+x0*hg1(2:end)'-y0).^2)/(m-n-1))
    rmse2=sqrt(sum((hg23(1)+x0*hg23(2:end)'-y0).^2)/(m-num))

    主成分个数的选取,根据相关系数阵的特征值进行初步判断,四个值分别是:2.2357,1.5761,0.1866,0.0016,因为最后一个接近于0,前三个累计贡献率达到0.999594,因此我们选择3个。

    运行结果:



    因为rmse1<rmse2,所以发现主成分回归均方误差更小,因而更稳定。而且Hald线性回归系数无法通过显著性检验,一般对多元回归系数进行t检验。

    曲线对比图像:




    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    用Python完成Excel的常用操作
    用Python实现excel 14个常用操作
    ubuntu and centos各种上网代理设置
    vim 熟练度练习
    Ansible-playbook 使用方式 看一篇就够了
    python 使用ldap3 查询跨域的用户信息
    python pyinstaller 的使用
    vs code新建python虚拟环境
    vs code 远程开发环境设置
    上下文管理器(Context Manager)
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965350.html
Copyright © 2011-2022 走看看