【matlab数学建模学习】PCA应用案例:企业综合实力排序

PCA应用案例:企业综合实力排序

PCA降维步骤

  1. 原始数据标准化处理(Z标准化)
  2. 计算样本相关系数矩阵
  3. 计算相关系数矩阵的特征值和相应的特征向量
  4. 选择重要的主成分,并写出主成分表达式
  5. 计算主成分得分
  6. 依据主成分得分的数据,进一步分析和建模

案例分析

【matlab数学建模学习】PCA应用案例:企业综合实力排序

在此案例中,我们的目标是对评价表中的15家企业进行综合实力排序。表中数据总共有8个指标,各个指标之间关系并不明确,而且在数量级上也有差异。所以刚好符合PCA的应用要求,于是,我们可以先用PCA进行数据降维,然后根据打分结果对表中的企业进行排序。

MATLAB程序实现

一、原始数据标准化处理(Z标准化)


  1. 读入数据

    A=xlsread('Coporation_evaluation.xlsx', 'B2:I16');
    
    【matlab数学建模学习】PCA应用案例:企业综合实力排序
  2. Z标准化处理
    x ∗ = x − μ σ x^*=\frac{x-\mu}{\sigma} x∗=σx−μ​

% Transfer orginal data to standard data
a=size(A,1);   % Get the row number of A
b=size(A,2);   % Get the column number of A
for i=1:b
    SA(:,i)=(A(:,i)-mean(A(:,i)))/std(A(:,i));  % Matrix normalization
end

size(A,dim) 返回维度 dim 的长度。

【matlab数学建模学习】PCA应用案例:企业综合实力排序

二、计算样本相关系数矩阵


% Calculate correlation matrix of A.
CM=corrcoef(SA);

CM = corrcoef(SA) 返回 SA 的相关系数的矩阵,其中 SA 的列表示随机变量,行表示观测值。

【matlab数学建模学习】PCA应用案例:企业综合实力排序

对于单矩阵输入,根据 SA 表示的随机变量数(列数),CM 的大小为 [size(SA,2) size(SA,2)]。对角线元素按照约定设置为 1,而非对角线元素是变量对组的相关系数。系数值的范围是从 -1 到 1,其中 -1 表示直接负相关性,0 表示无相关性,1 表示直接正相关性。CM 是对称的。

三、计算相关系数矩阵的特征值和相应的特征向量


% Calculate eigenvectors and eigenvalues of correlation matrix.
[V, D]=eig(CM);

[V,D] = eig(CM) 返回特征值的对角矩阵 D 和矩阵 V,其列是对应的右特征向量,使得 A*V = V*D

V(特征向量):

【matlab数学建模学习】PCA应用案例:企业综合实力排序

D(特征值):

【matlab数学建模学习】PCA应用案例:企业综合实力排序

四、选择重要的主成分,并写出主成分表达式

  1. 主成分的累计贡献率计算

    主成分分析一般可以得到p个主成分,但是在实际分析中,根据各个主成分累计贡献率的大小选取前k个主成分。这里的贡献率是指某个主成分的方差占全部方差的比重,实际上也是某个特征值占全部特征值之和的比重。

    主成分个数k的选取,一般要求累计贡献率达到85%以上,保证综合变量能包括原始变量的绝大多数信息。

    贡 献 率 = λ i ∑ i = 1 p λ i 贡献率=\frac{\lambda_i}{\sum^{p}_{i=1}{\lambda_i}} 贡献率=∑i=1p​λi​λi​​

    % Get the eigenvalue sequence according to descending and the corrosponding
    % attribution rates and accumulation rates.
    for j=1:b
        DS(j,1)=D(b+1-j, b+1-j);	% 对特征值按降序进行排列
    end
    for i=1:b
        DS(i,2)=DS(i,1)/sum(DS(:,1));	% 贡献率
        DS(i,3)=sum(DS(1:i,1))/sum(DS(:,1));	% 累计贡献率
    end
    
    【matlab数学建模学习】PCA应用案例:企业综合实力排序

    结果如上图所示。第一列是各个主成分的eigenvalues,第二列是主成分的attribution rates,第三列是accumulation rates。

  2. 按照预设的信息保留率筛选出k个主成分

    % Calculate the number of principal components.
    T=0.9;  % set the threshold value for evaluating information preservation level.
    for K=1:b
        if DS(K,3)>=T		% 累计贡献率是否达到阈值90%
            Com_num=K;
            break;
        end
    end
    

    运行得:Com_num = 3,所以应当取DS中的前3个主成分,从DS的数据不难看出前三个主成分的贡献率累计起来为0.9279超过阈值0.9,于是确定k=3,而DS所对应的主成分的特征向量正好是V中的后三个。

    【matlab数学建模学习】PCA应用案例:企业综合实力排序

    提取主成分对应的特征变量:

    % Get the eigenvectors of the Com_num principal components
    for j=1:Com_num
        PV(:,j)=V(:,b+1-j);
    end
    
    【matlab数学建模学习】PCA应用案例:企业综合实力排序

五、计算主成分得分


根据标准化的原始数据,按照各个样品,分别代入主成分表达式,计算得到各主成分下各个样本的主成分得分。

% Calculate the new socres of the orginal items
new_score=SA*PV;	% 15x8*8x3-->15x3

for i=1:a
    total_score(i,2)=sum(new_score(i,:));
    total_score(i,1)=i;
end
new_score_s=sortrows(total_score,-2);

sortrows(A,column) 基于向量 column 中指定的列对 A 进行排序。

column为负整数表示排序顺序为降序。

【matlab数学建模学习】PCA应用案例:企业综合实力排序

各个评价对象的主成分得分:

【matlab数学建模学习】PCA应用案例:企业综合实力排序

按降序排序后:

【matlab数学建模学习】PCA应用案例:企业综合实力排序

OK~至此,我们得到了各个评价对象得分的降序表,这也就是15家企业的综合实力排序,从表可知第9家企业实力最强,第12家企业实力最弱。

以上便是PCA的简单实践,具体的PCA方法的使用还要根据实际问题和需要灵活使用。

实践总结

  • 第一次上手matlab做数据处理,体验还是极佳的。不愧为国赛大佬都用的数学建模工具,数据可视化做得相当不错,各种api帮助文档是我见过的最舒服的(还全是中文),很详细和规范。
  • PCA的这种降维思想确实好用,在面对一大堆令人茫然的数据,众多指标下,PCA抽取出了包括原始变量的绝大多数信息的综合变量,代替了原来的变量,达到了降维简化的目的。

实践总结

  • 第一次上手matlab做数据处理,体验还是极佳的。不愧为国赛大佬都用的数学建模工具,数据可视化做得相当不错,各种api帮助文档是我见过的最舒服的(还全是中文),很详细和规范。
  • PCA的这种降维思想确实好用,在面对一大堆令人茫然的数据,众多指标下,PCA抽取出了包括原始变量的绝大多数信息的综合变量,代替了原来的变量,达到了降维简化的目的。
  • 当然我也生发了一些问题,比如:当数据属性足够多的时候,相关系数矩阵R也会随之会变得相当庞大,计算量势必增大,这个方法是否还建议使用呢?PCA的前提是众多变量应当具有一定的相关性,那么如果数据互不相关,或者不相关的变量占比过大,会不会影响最终的结果?又是否需要在使用PCA之前完成相关性可视化来进行变量筛选?
上一篇:主成分分析(PCA)原理


下一篇:主成分分析(PCA)直观的理解