主成分分析(理论及Matlab实现)

 应用场景   

        主成分分析(Principal Component Analysis,PCA),主要用于对特征变量进行降维,在面对特征变量过多的时候使用。由于变量之间具有一定的相关关系,此时可以解释为这两个变量反映的信息有一定的重叠。针对这些重复的变量(关系紧密的变量)可以进行删减融合,建立尽可能少的新变量,使得这些新变量是两两不相关的,而且这些新变量在反映的信息方面尽可能保持原有的信息。

        将原来变量重新组合成一组新的互相无关的几个综合变量,同时根据实际需要从中可以取出几个较少的综合变量尽可能多地反映原来变量的信息的统计方法。

        个人使用较多的场景是对高维数据预处理和回归特征的提取。

原理

主要思想

        PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。

        通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。

计算步骤

        假设有 n个样本,每个样本有p 个指标,则可构成大小为 n × p 的样本矩阵 X :  

\mathrm{X}=\left[\begin{array}{cccc} \mathrm{x}_{11} & \mathrm{x}_{12} & \cdots & \mathrm{x}_{1 \mathrm{p}} \\ \mathrm{x}_{21} & \mathrm{x}_{22} & \cdots & \mathrm{x}_{2 \mathrm{p}} \\ \vdots & \vdots & \ddots & \vdots \\ \mathrm{x}_{\mathrm{n} 1} & \mathrm{x}_{\mathrm{n} 2} & \cdots & \mathrm{x}_{\mathrm{np}} \end{array}\right]

1. 首先对数据进行标准化处理:

X_{ij} = \frac{x_{ij}-\bar{x} _{j}}{S_{j}}

        其中:\bar{x} _{j}为每列的均值;S_{j}为每列的标准差,公示如下:

\mathrm{S}_{\mathrm{j}}=\sqrt{\frac{\sum_{\mathrm{i}=1}^{\mathrm{n}}\left(\mathrm{x}_{\mathrm{ij}}-\overline{\mathrm{x}}_{\mathrm{j}}\right)^{2}}{\mathrm{n}-1}}

        将X更新为标准化后的矩阵:

\mathrm{X}=\left[\begin{array}{cccc} \mathrm{X}_{11} & \mathrm{X}_{12} & \cdots & \mathrm{X}_{1 \mathrm{p}} \\ \mathrm{X}_{21} & \mathrm{X}_{22} & \cdots & \mathrm{X}_{2 \mathrm{p}} \\ \vdots & \vdots & \ddots & \vdots \\ \mathrm{X}_{\mathrm{n} 1} & \mathrm{X}_{\mathrm{n} 2} & \cdots & \mathrm{X}_{\mathrm{np}} \end{array}\right]

2. 计算标准化样本的协方差矩阵

\mathrm{R}=\left[\begin{array}{cccc} \mathrm{r}_{11} & \mathrm{r}_{12} & \cdots & \mathrm{r}_{1 \mathrm{p}} \\ \mathrm{r}_{21} & \mathrm{r}_{22} & \cdots & \mathrm{r}_{2 \mathrm{p}} \\ \vdots & \vdots & \ddots & \vdots \\ \mathrm{r}_{\mathrm{p} 1} & \mathrm{r}_{\mathrm{p} 2} & \cdots & \mathrm{r}_{\mathrm{pp}} \end{array}\right]

        协方差则一般用来刻画两个随机变量的相似程度,协方差计算公式为:

\mathrm{r}_{\mathrm{ij}}=\frac{1}{\mathrm{n}-1} \sum_{\mathrm{k}=1}^{\mathrm{n}}\left(\mathrm{X}_{\mathrm{ki}}-\overline{\mathrm{X}}_{\mathrm{i}}\right)\left(\mathrm{X}_{\mathrm{ki}}-\overline{\mathrm{X}}_{\mathrm{j}}\right)=\frac{1}{\mathrm{n}-1} \sum_{\mathrm{k}=1}^{\mathrm{n}} \mathrm{X}_{\mathrm{ki}} \mathrm{X}_{\mathrm{kj}}

3. 计算协方差矩阵的特征值和特征向量

        协方差矩阵R具有n个特征值\lambda _{1}\lambda _{2},…,\lambda _{p};及n个对应的特征向量,求解特征向量:

\mathrm{a}_{1}=\left[\begin{array}{c} \mathrm{a}_{11} \\ \mathrm{a}_{21} \\ \vdots \\ \mathrm{a}_{\mathrm{p} 1} \end{array}\right], \mathrm{a}_{2}=\left[\begin{array}{c} \mathrm{a}_{12} \\ \mathrm{a}_{22} \\ \vdots \\ \mathrm{a}_{\mathrm{p} 2} \end{array}\right], \cdots, \mathrm{a}_{\mathrm{p}}=\left[\begin{array}{c} \mathrm{a}_{1 \mathrm{p}} \\ \mathrm{a}_{2 \mathrm{p}} \\ \vdots \\ \mathrm{a}_{\mathrm{pp}} \end{array}\right]

4.计算主成分贡献率和累计贡献率

         每个特征的贡献率为其特征值所占的比值,即:

rate= \frac{\lambda _{i}}{\sum_{k=1}^{p}\lambda_{k}}

累计贡献率为:

total\_rate=\frac{\sum_{\mathrm{k}=1}^{\mathrm{i}} \lambda_{\mathrm{k}}}{\sum_{\mathrm{k}=1}^{\mathrm{p}} \lambda_{\mathrm{k}}}

5. 找出主成分

        统计累计贡献率,只保留贡献率较高的前几个变量值,一般贡献率取85%,写出对应的前m个主成分,其中m肯定是一个小于p的值。

第i个主成分:

\mathrm{F}_{\mathrm{i}}=\mathrm{a}_{1 \mathrm{i}} \mathrm{X}_{1}+\mathrm{a}_{2 \mathrm{i}} \mathrm{X}_{2}+\cdots+\mathrm{a}_{\mathrm{pi}} \mathrm{X}_{\mathrm{p}}

实例分析

对某磨机数据进行处理后得到如下的数据:

时间给矿量x1返砂量x2磨机总功率x3给矿水流量x4排矿水流量x5冲筛水流量x6返砂比
00:00960.9690.346763.89217.63513.9954.590.088
00:40

960.27

85.296623.43214.22340.3754.600.089
01:20959.8785.746595.99213.99332.0854.640.090
02:00960.3786.966622.91214.07343.9154.700.097
02:40960.2494.046654.79214.14339.0954.7900.105
03:20955.26101.056768.13214.11369.2854.840.119
04:00963.32113.916859.26217.57304.7254.930.145
04:40961.68140.097129.90219.97298.9754.910.137
05:20960.08132.707409.50225.64306.7354.860.122
06:00961.26117.867254.85223.43300.8554.880.111
06:40960.28107.457052.22220.81335.6454.890.112
07:20959.52107.786974.43217.88331.5354.960.097
08:00961.4093.656899.92218.64320.9554.940.087
08:40960.1083.746670.77215.38304.6355.070.083

        处理后的数据为每隔40分钟某工厂半自磨机(SAG)运行参数整合,数据量n为2907条,上述表格只展示部分数据,特征向量有给矿量、返砂量、磨机总功率、给矿水流量、排矿水流量、冲筛水流量6个指标,现对这六个指标进行主成分分析,对指标进行降维。

Matlab代码

主程序:

Data = xlsread('data.xlsx');
data = Data(:,3:end-1);    %数据导入
data2 = PCA(data,0.85);    %运行主成分分析子程序

        导入数据data,为已处理好的数据,PCA为子程序

主成分分析子程序:

function Data_var = PCA(data,n)
%主成分分析,输入数组和累计贡献率,得到处理后的变量数组。
%输入数组data;行为数据条数,列为指标
%输入n,为可接受累计贡献率范围,一般取0.85
%输出Data_var为处理后的变量数组
%程序会输出主成分个数和各个主成分变量

    x = zscore(data);    %数据标准化;    
    std=corrcoef(x);   %计算相关系数矩阵
    [vec,val]=eig(std);   %求特征值(val)及特征向量(vec)
    newval=diag(val) ;  %将特征值作成一个新向量
    [y,ii] = sort(newval);   %对特征根进行排序,y为排序结果,ii为索引
    rate = y/sum(y);   %计算贡献率
    sumrate=0;    newi=[];
    for k=length(y):-1:1
        sumrate=sumrate+rate(k);
        newi(length(y)+1-k)=ii(k);
        if sumrate>n
            break;
        end
    end
    fprintf('主成分个数:%g\n\n',length(newi));    %输出主成分个数
    for i=1:1:length(newi)      %计算载荷aa
        for j=1:1:length(y)
            aa(i,j)=sqrt(newval(newi(i)))*vec(j,newi(i));
        end
    end
    aaa=aa.*aa;          %主成分载荷归一化zcfhz
    for i=1:1:length(newi)
        for j=1:1:length(y)
            zcfhz(i,j)=aa(i,j)/sqrt(sum(aaa(i,:)));
        end
    end
    disp('主成分为:')
    for i = 1:length(newi)
        Data_var(:,i) = data(:,1).*zcfhz(i,1) + data(:,2).*zcfhz(i,2) + data(:,3).*zcfhz(i,3) + data(:,4).*zcfhz(i,4) + data(:,5).*zcfhz(i,5) + data(:,6).*zcfhz(i,6);
        fprintf('F%d = %4.2f * x1 + %4.2f * x2 + %4.2f * x3 + %4.2f * x4 + %4.2f * x5 + %4.2f * x6\n',i,zcfhz(i,1),zcfhz(i,2),zcfhz(i,3),zcfhz(i,4),zcfhz(i,5),zcfhz(i,6));
    end

end

        输入数组data;行为数据条数,列为指标;输入n,为可接受累计贡献率范围,一般取0.85
输出Data_var为处理后的变量数组;程序会输出主成分个数和各个主成分变量

运行结果:

主成分个数:5

5个主成分变量为:
F1 = -0.08 * x1 + -0.31 * x2 + 0.59 * x3 + 0.29 * x4 + -0.38 * x5 + 0.57 * x6
F2 = -0.55 * x1 + -0.51 * x2 + -0.15 * x3 + -0.64 * x4 + -0.06 * x5 + 0.07 * x6
F3 = 0.06 * x1 + -0.45 * x2 + 0.42 * x3 + 0.11 * x4 + 0.73 * x5 + -0.25 * x6
F4 = 0.81 * x1 + -0.40 * x2 + -0.05 * x3 + -0.35 * x4 + -0.25 * x5 + -0.04 * x6
F5 = 0.18 * x1 + 0.27 * x2 + -0.08 * x3 + -0.31 * x4 + 0.49 * x5 + 0.74 * x6

处理后的变量data_var:(节选)

时间F1F2F3F4F5
00:003753.24-1738.503269.51229.46-124.01
00:403737.15-1701.823084.63281.72-198.63
01:203724.05-1697.113066.68284.61-200.35
02:003734.99-1702.773086.21280.34-196.26
02:403753.36-1710.753092.93277.15-199.29

总结:

        此实例基本可以体现主成分分析的用法,但在此应用中仅为尝试性应用,降维效果和使用意义不大;在此案例中不具有实用性。但此理论和PCA子程序算法可通用,在后续用到时可直接采用运行即可。

主成分分析模型总结评价:

  • 主成分分析处理后的变量具有一定的模糊性,难以解释,偏离了其实际意义,不如原始变量清晰准确。
  • 主成分分析在降维过程中难免会产生数据损失,为后续处理带来误差,属于使用可接受范围内的误差来获得更易处理的数据项。
  • 更多的应用场景是对于变量维度很大的时候,需要使用降维才能方便进一步的数据处理。
  • 10
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值