一 主成分分析(PAC)
遇到由多个变量决定的问题的时候,其变量之间存在相互关系,分析问题难度很大。因此我们可以找到具有代表性的几个变量,且变量之间不存在联系。由这几个代表性变量分析与建模解决该问题,这就是主成分分析法。
1.1 PAC基本原理
将相互关联的数据通过线性组合为互不相关的新的综合变量,在新的变量中我们要找到尽可能多的代表原变量。而在数据的处理过程中方差越大,则表示原数据波动越大,覆盖范围更广,因此选择方差最大的作为第一主成分。但是并不能有效代表原变量,因此需要找到第二主成分、第三主成分……直至有效代表原变量。并且第一主成分与第二主成分之间满足①,即第二主成分中不包含第一主成分代表的变量。
1.2 PAC步骤
(1)对原数据进行标准化处理。假设数据样本:
将数据进行如下处理:
其中,
,
(2)计算样本相关系数矩阵。假设原始数据标准化(去关联)后仍用X表示,则相关系数为:
其中:
(3)计算相关系数矩阵R的特征值和相应的特征向量:
(4)根据贡献率的大小选取k个主成分并写出表达式:
k值得选取由累计贡献率决定,累计贡献率一般为85%:
(5)计算主成分得分。
其中:
(6)依据主成分得分的数据,进一步对问题进行后续分析和建模。
1.3 MATLAB仿真练习
clc,clear,close all
X=xlsread('F:\MATLAB_test\data_test_a.xlsx');
Y=xlsread('F:\MATLAB_test\data_test_a.xlsx',1,'A1:F6');
N=size(Y,1);
M=size(Y,2);for i=1:M
Eg(:,i)=(Y(:,i)-mean(Y(:,i)))/std(Y(:,i));
if i==M
op=std(Y(:,i));
end
end
CM=corrcoef(Eg);
[V,eValue]=eig(Eg);
for j=1:M
DeValue(j,1)=eValue(j,j);
end
SV=sort(DeValue(:,1),'descend');
for k=1:M
k_value(k,1)=k;
SV(k,2)=SV(k,1)/sum(SV(:,1));
SV(k,3)=sum(SV(1:k,1))/sum(SV(:,1));
end
程序如上图所示,没有选择好的数据,因此结果并不是很适合该题。注重运算过,其结果如下
相关系数矩阵:
特征值矩阵:
特征向量矩阵:
特征值&贡献率&累计贡献率:
可以看出计算结果在特征值得筛选上并没有效果,因此用1到6代替特征值,然后进行筛选;
s_value=sort(k_value(:,1),'descend');
for m=1:M
s_value(m,2)=s_value(m,1)/sum(s_value(:,1));
s_value(m,3)=sum(s_value(1:m,1))/sum(s_value(:,1));
end
T=0.7;
t=0;
for n=1:M
if s_value(n,3)>=T
Com_num=n;
break;
end
end
计算贡献率和累计贡献率:
将保留率设置为0.7,则可以得到结果为3,也就是所需提取的特征向量有三个,按原数据特征值向量从大到小选择:
for t_nump=1:6
if DeValue(t_nump,1)>=SV(3,1)
t=t+1;
need_n(t,1)=t_nump;
end
end
for t_num=1:3
need_p(:,t_num)=V(:,need_n(t_num,1));
end
选取结果:
然后根据公式就可以计算出主成分得分情况。
for t_num=1:3
need_p(:,t_num)=V(:,need_n(t_num,1));
need_q(:,t_num)=Eg(:,need_n(t_num,1));
end
new_score=Eg*need_q;
for i=1:N
total_score(i,1)=sum(new_score(i,:));
total_score(i,2)=i;
end
result_report=[new_score,total_score];
result_report=sortrows(result_report,-4);
得到结果如下:
①:统计学中表示协方差。
在概率论和统计学中协方差表示两个变量的总体误差,期望与协方差满足一下关系式:
当两个变量的线性无关时满足,因此当是线性无关。
[1]卓金武,王鸿钧等,《MATLAB数学建模方法与实践》(第三版)