这段时间一直在学习数据挖掘的一些算法,今天通过不断查阅资料,学习整理了一下主成分分析这个数据降维算法。并且结合一个实例进行matlab编程实现。
主成分基本原理
在数据挖掘中,经常会遇到一个问题就是一个问题出现了n多个变量,而且变量之间还可能会存在各种复杂的相互联系,变量之间并不是独立的。那么主成分分析就是将多个变量综合为少数几个代表性的变量,而且这些主要的变量仅能够代表原始变量的绝大多数信息又互不相关的一种数据降维算法。
主成分分析采取一种数据降维思想,其所要做的就是设法就原来众多的具有一定相关性的变量,重新组合为一种新的相互无关的综合变量来代表原来的众多个变量。它借助于一个正交变换,将其分量相关的原随机向量转化成其分量不相关的新随机向量,这在代数上表现为将原随机向量的协方差阵变换成对角形阵,在几何上表现为将原坐标系变换成新的正交坐标系,使之指向样本点散布最开的p 个正交方向,然后对多维变量系统进行降维处理,使之能以一个较高的精度转换成低维变量系统,再通过构造适当的价值函数,进一步把低维系统转化成一维系统。
主成分分析的原理是设法将原来变量重新组合成一组新的相互无关的几个综合变量,同时根据实际需要从中可以取出几个较少的总和变量尽可能多地反映原来变量的信息的统计方法叫做主成分分析或称主分量分析,也是数学上处理降维的一种方法。主成分分析是设法将原来众多具有一定相关性(比如P个指标),重新组合成一组新的互相无关的综合指标来代替原来的指标。通常数学上的处理就是将原来P个指标作线性组合,作为新的综合指标。最经典的做法就是用F1(选取的第一个线性组合,即第一个综合指标)的方差来表达,即Var(F1)越大,表示F1包含的信息越多。因此在所有的线性组合中选取的F1应该是方差最大的,故称F1为第一主成分。如果第一主成分不足以代表原来P个指标的信息,再考虑选取F2即选第二个线性组合,为了有效地反映原来信息,F1已有的信息就不需要再出现再F2中,用数学语言表达就是要求:
Cov(F1,F2)=0
则称F2为第二主成分,依此类推可以构造出第三、第四,……,第P个主成分。PCA方法计算步骤
(1)首先对于原始数据进行标准化处理。
X=
x11x21⋮xn1x12x22⋮xn2⋯⋯⋮⋯x1px2p⋮xnp
那么就可以将X按照列进行Z−score 标准化.其转化函数为:
x∗=x−μσ
其中μ为按照列计算得到的样本数据均值,σ 位按照列计算得到的样本数据的标准差。
(2)计算经过标准化处理后得到的数据的相关性矩阵。
R=
r11r21⋮rn1r12r22⋮rn2⋯⋯⋮⋯r1pr2p⋮rnp
其中:rij=Cov(xi,xj)var(xi)√var(xj)√=∑k=nk=1(xki−x¯i)(xkj−x¯j)∑k=nk=1(xki−x¯i)√∑k=nk=1(xkj−x¯j)√,n>1.
(3)计算相关系数矩阵R特征值(λ1,λ2,⋯,λp 和相应的特性向量ai=(ai1,ai2,⋯,ai3)
(4)对特征值进行降序排列。
(5)计算降序排列后的特征值的贡献率以及累计贡献率
contributionRate=λi∑pi=1λi
accumulativeContributionRate=∑ki=1λi∑pi=1λi,k≤p.
(6)计算主成分得分矩阵
根据标准化的原始数据,按照各个样品,分别带入主成分表达式,就可以得到各个主成分下的各个样品的新数据,即主成分的得分。具体形式为:
F11F21⋮Fn1F12F22⋮Fn2⋯⋯⋱⋯F1kF1k⋮Fnk
其中,Fij=aj1xi1+aj2xi2+⋯+ajpxip,i=1,2,⋯,n,j=1,2,⋯,k。Matlab程序实现
clc
clear
close all
%%
%数据导入
coporationEvaluation=xlsread('Coporation_evaluation.xlsx','B2:I16');
%%
%数据预处理
%利用size函数得到数据集中的公司数量以及变量数量
[corporationNumber,variableNumber]=size(coporationEvaluation);
%预先定义标准化后的数据矩阵
normalizedcorporationEvaluation=zeros(corporationNumber,variableNumber);
%利用Z-score方法进行数据标准化
for i=1:variableNumbernormalizedcorporationEvaluation(:,i)=(coporationEvaluation(:,i)-...mean(coporationEvaluation(:,i)))./std(coporationEvaluation(:,i));
end
%%
%数据相关系数矩阵求解以及相关系数矩阵的对应的特征值以及特征向量求解。
%计算标准化后的数据集的相关系数矩阵relativeCoefficientMatrix=corrcoef(normalizedcorporationEvaluation);%计算相关系数矩阵的特征向量以及特征值矩阵,
[eigenVector,eigenValueDig]=eig(relativeCoefficientMatrix);
%因为使用eig函数计算得到的特征值为一个variable*variable的对角阵,
%因此需要处理一下将特征值矩阵存放在一个行向量里面
eigenValue=zeros(variableNumber,1);
for j=1:variableNumbereigenValue(j,1)=eigenValueDig(j,j);
end
%将特征值进行降序排列
eigenValue=sort(eigenValue,'descend');
%%
%计算排序后的主成分的贡献率以及累计贡献率
for k=1:variableNumbercontributionRateOfEachEigenValue=eigenValue(k,1)/sum(eigenValue);accumulativeContributionRate(k,1)=sum(eigenValue(1:k,1))/sum(eigenValue);
end
%设置主成分信息保留率
pcaInformationRetensionRatio=0.9;
%统计在满足主成分保留率的主成分的数量。
for l=1:variableNumberif accumulativeContributionRate(l,1)>pcaInformationRetensionRatio;mainComponentNumber=l;break;end
end
%截取主成分对应的特征向量
for ii=1:mainComponentNumbermainComponentBasedVector(:,ii)=eigenVector(:,variableNumber+1-ii);
end
%%
%计算打分矩阵
scoreMatrix=normalizedcorporationEvaluation*mainComponentBasedVector;
%计算最终的公司的总打分,finalScoreMatrix的第一列为打分值,第二列为公司序号。
for jj=1:corporationNumberfinalScoreMatrix(jj,1)=sum(scoreMatrix(jj,:));finalScoreMatrix(jj,2)=jj;
end
%对打分矩阵按照分数那一列进行降序排列
finalScoreMatrix=sortrows(finalScoreMatrix,-1);
disp('the tope 5 corperations is: ')
%输出排名前5的公司序号
for kk=1:5finalScoreMatrix(kk,2)
end
4 . 结果
1)特征值贡献率以及累计贡献率:
特征值 | 贡献率 | 累计贡献率 | ||
---|---|---|---|---|
5.7261 | 0.7170 | 0.7170 | ||
1.0972 | 0.1372 | 0.8547 | ||
0.5896 | 0.0737 | 0.9279 | ||
0.2858 | 0.0357 | 0.9636 | ||
0.1456 | 0.0182 | 0.9818 | ||
0.1369 | 0.0171 | 0.9989 | ||
0.0060 | 0.00075 | 0.9997 | ||
0.0027 | 0.002034 | 1.0000 |
2)公司打分以及排名
特征值 | 贡献率 | |
---|---|---|
4.235 | 9 | |
3.971 | 1 | |
2.367 | 8 | |
1.970 | 6 | |
1.798 | 5 | |
1.103 | 13 | |
0.752 | 15 | |
0.168 | 14 | |
-0.292 | 2 | |
-1.007 | 10 | |
-1.523 | 7 | |
-2.054 | 4 | |
-2.513 | 11 | |
-3.643 | 3 | |
-5.332 | 12 |
可依据打分结果得出,综合实力最强的是序号为9的那家公司。
5 . Matlab自带主成分分析函数pca对比验证
为了表明计算的准确性,我再采用了matlab自带的主成分函数pca进行了一个对比验证。
[COEFF,SCORE,latent]=pca(zscore(coporationEvaluation))
返回的latent是一个向量,它是X所对应的协方差矩阵的特征值向量。
我们主要看latent矩阵得到结果
特征值 |
---|
5.7261 |
1.0972 |
0.5896 |
0.2858 |
0.1456 |
0.1369 |
0.0060 |
0.0027 |
发现计算结果是一样的。
6 . 主成分分析法优缺点
优点:
①可消除评估指标之间的相关影响。因为主成分分析法在对原始数据指标变量进行变换后形成了彼此相互独立的主成分,而且实践证明指标间相关程度越高,主成分分析效果越好。
②可减少指标选择的工作量,对于其他评估方法,由于难以消除评估指标间的相关影响,所以选择指标时要花费不少精力,而主成分分析法由于可以消除这种相关影响,所以在指标选择上相对容易些。
③主成分分析中各主成分是按方差大小依次排列顺序的,在分析问题时,可以舍弃一部分主成分,只取前面方差较大的几个主成分来代表原变量,从而减少了计算工作量。用主成分分析法作综合评估时,由于选择的原则是累计贡献率≥85%,不至于因为节省了工作量却把关键指标漏掉而影响评估结果。
缺点:
①在主成分分析中,我们首先应保证所提取的前几个主成分的累计贡献率达到一个较高的水平(即变量降维后的信息量须保持在一个较高水平上),其次对这些被提取的主成分必须都能够给出符合实际背景和意义的解释(否则主成分将空有信息量而无实际含义)。
②主成分的解释其含义一般多少带有点模糊性,不像原始变量的含义那么清楚、确切,这是变量降维过程中不得不付出的代价。因此,提取的主成分个数m通常应明显小于原始变量个数p(除非p本身较小),否则维数降低的“利”可能抵不过主成分含义不如原始变量清楚的“弊”。
③当主成分的因子负荷的符号有正有负时,综合评价函数意义就不明确。