主成分分析法概述
主成分分析(PCA)是一种降维算法,能够将多个数据指标转换为少数几个主成分,这些主成分是原始变量的线性组合,并且彼此之间互不相关,能够反映原始数据的大部分信息。
主成分分析法的适用情况
一般来说,当研究的问题涉及多个变量且变量之间存在很强的相关性时可以考虑使用主成分分析来对问题数据进行简化。
数据降维的定义
数据降维是指将高维度的数据(指标太多的数据)保留下最重要的一些特征,去除噪声和不重要的特征。当然,降维会导致信息产生一定的损失。
数据降维的作用
使得数据集更加容易使用;降低算法的计算开销;去除噪声;使得模型结果更加容易理解。主成分分析的步骤
构建初始数据矩阵:矩阵的每一行表示一个样本,每一列表示一个原始指标。矩阵中的每一个元素表示某一个样本在某一个指标下的得分。计算相关系数矩阵:对初始数据矩阵中的各个指标,求出相关系数矩阵。计算特征值和特征向量:计算样本相关系数矩阵的特征值和特征向量。计算完成后对特征值进行从大到小的排序。计算主成分贡献率和累计贡献率:每一个特征值对应一个主成分和贡献率,某特征值的贡献率=该特征值/所有特征值的和,该特征值对应的主成分即为对应的特征向量。选择保留的主成分:一般取累计贡献率超过百分之80的那些主成分作为最终结果。特征值对应的特征向量即为主成分的系数。根据系数分析主成分代表的含义。利用主成分进行后续的分析过程。主成分分析法的不足
主成分的含义解释一般都会带有一些模糊性,不像原始变量那么清楚确切,这是变量降维过程中不得不付出的代价。因此,只有当主成分的个数远小于原始变量的个数时才使用主成分分析,否则可能弊大于利。主成分分析中如果有一个主成分解释不了,那么就可以认为主成分分析失败了。
主成分分析的注意事项
在评价类模型中,不能先用主成分分析后再对主成分进行评价。主成分分析可以用于聚类。因为聚类结果的维度往往很高,这时可以通过主成分分析法对聚类结果降维,从而在二维或三维空间中作出聚类结果图。国赛C题主成分分析应用实例(Matlab)
% 首先导入原始数据矩阵load HighK_Matrix.matload PbBa_Matrix.mat%% 高钾玻璃的主成分计算部分Sample_Count=size(HighK_Matrix,1);Factor_Count=size(HighK_Matrix,2);% 第一步:计算原始数据矩阵的相关系数矩阵R=corrcoef(HighK_Matrix);disp("相关系数矩阵为:");disp(R);% 第二步:计算相关系数矩阵的特征值和特征向量[A,B]=eig(R);% 第三步:计算各个特征值对应的贡献率以及累计贡献率CharacteristicValues_Vector=diag(B);CharacteristicValues_Vector=CharacteristicValues_Vector(end:-1:1);Cum_DevotionRate=cumsum(CharacteristicValues_Vector./Factor_Count);disp("累计贡献率为:");disp(Cum_DevotionRate);% figure(1);% plot([1:14],Cum_DevotionRate);% 第四步:筛选合适个数的主成分,并输出相应的主成分MainFactor_Count=input("请输入需要保留的主成分个数:");A=rot90(A);for i=1:MainFactor_Countdisp(strcat("第",num2str(i),"个主成分的系数为:"));disp((A(:,i))');end%% 铅钡玻璃的主成分计算部分Sample_Count=size(HighK_Matrix,1);Factor_Count=size(HighK_Matrix,2);% 第一步:计算原始数据矩阵的相关系数矩阵R=corrcoef(PbBa_Matrix);disp("相关系数矩阵为:");disp(R);% 第二步:计算相关系数矩阵的特征值和特征向量[A,B]=eig(R);% 第三步:计算各个特征值对应的贡献率以及累计贡献率CharacteristicValues_Vector=diag(B);CharacteristicValues_Vector=CharacteristicValues_Vector(end:-1:1);Cum_DevotionRate=cumsum(CharacteristicValues_Vector./Factor_Count);disp("累计贡献率为:");disp(Cum_DevotionRate);% figure(2);% plot([1:14],Cum_DevotionRate);% 第四步:筛选合适个数的主成分,并输出相应的主成分MainFactor_Count=input("请输入需要保留的主成分个数:");A=rot90(A);for i=1:MainFactor_Countdisp(strcat("第",num2str(i),"个主成分的系数为:"));disp((A(:,i))');end