PCA应用案例:企业综合实力排序
PCA降维步骤
- 原始数据标准化处理(Z标准化)
- 计算样本相关系数矩阵
- 计算相关系数矩阵的特征值和相应的特征向量
- 选择重要的主成分,并写出主成分表达式
- 计算主成分得分
- 依据主成分得分的数据,进一步分析和建模
案例分析
在此案例中,我们的目标是对评价表中的15家企业进行综合实力排序。表中数据总共有8个指标,各个指标之间关系并不明确,而且在数量级上也有差异。所以刚好符合PCA的应用要求,于是,我们可以先用PCA进行数据降维,然后根据打分结果对表中的企业进行排序。
MATLAB程序实现
一、原始数据标准化处理(Z标准化)
-
读入数据
A=xlsread('Coporation_evaluation.xlsx', 'B2:I16');
-
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
的长度。
二、计算样本相关系数矩阵
% Calculate correlation matrix of A.
CM=corrcoef(SA);
CM = corrcoef(SA)
返回SA
的相关系数的矩阵,其中SA
的列表示随机变量,行表示观测值。
对于单矩阵输入,根据
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(特征向量):
D(特征值):
四、选择重要的主成分,并写出主成分表达式
-
主成分的累计贡献率计算
主成分分析一般可以得到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
结果如上图所示。第一列是各个主成分的eigenvalues,第二列是主成分的attribution rates,第三列是accumulation rates。
-
按照预设的信息保留率筛选出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
中的后三个。提取主成分对应的特征变量:
% Get the eigenvectors of the Com_num principal components for j=1:Com_num PV(:,j)=V(:,b+1-j); end
五、计算主成分得分
根据标准化的原始数据,按照各个样品,分别代入主成分表达式,计算得到各主成分下各个样本的主成分得分。
% 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
为负整数表示排序顺序为降序。
各个评价对象的主成分得分:
按降序排序后:
OK~至此,我们得到了各个评价对象得分的降序表,这也就是15家企业的综合实力排序,从表可知第9家企业实力最强,第12家企业实力最弱。
以上便是PCA的简单实践,具体的PCA方法的使用还要根据实际问题和需要灵活使用。
实践总结
- 第一次上手matlab做数据处理,体验还是极佳的。不愧为国赛大佬都用的数学建模工具,数据可视化做得相当不错,各种api帮助文档是我见过的最舒服的(还全是中文),很详细和规范。
- PCA的这种降维思想确实好用,在面对一大堆令人茫然的数据,众多指标下,PCA抽取出了包括原始变量的绝大多数信息的综合变量,代替了原来的变量,达到了降维简化的目的。
实践总结
- 第一次上手matlab做数据处理,体验还是极佳的。不愧为国赛大佬都用的数学建模工具,数据可视化做得相当不错,各种api帮助文档是我见过的最舒服的(还全是中文),很详细和规范。
- PCA的这种降维思想确实好用,在面对一大堆令人茫然的数据,众多指标下,PCA抽取出了包括原始变量的绝大多数信息的综合变量,代替了原来的变量,达到了降维简化的目的。
- 当然我也生发了一些问题,比如:当数据属性足够多的时候,相关系数矩阵R也会随之会变得相当庞大,计算量势必增大,这个方法是否还建议使用呢?PCA的前提是众多变量应当具有一定的相关性,那么如果数据互不相关,或者不相关的变量占比过大,会不会影响最终的结果?又是否需要在使用PCA之前完成相关性可视化来进行变量筛选?