数模算法:主成分分析
引入
主成分分析是一种降维算法,它能将多个指标转换为少数几 个主成分,这些主成分是原始变量的线性组合,且彼此之间 互不相关,其能反映出原始数据的大部分信息。一般来说, 当研究的问题涉及到多变量且变量之间存在很强的相关性时, 我们可考虑使用主成分分析的方法来对数据进行简化。
在实际问题研究中,多变量问题是经常会遇到的。变量太多,无疑 会增加分析问题的难度与复杂性,而且在许多实际问题中,多个变量之 间是具有一定的相关关系的。 因此,人们会很自然地想到,能否在相关分析的基础上,用较少 的新变量代替原来较多的旧变量,而且使这些较少的新变量尽可能多地 保留原来变量所反映的信息? 事实上,这种想法是可以实现的,主成分分析方法就是综合处理这 种问题的一种强有力的工具。 主成分分析是把原来多个变量划为少数几个综合指标的一种统计 分析方法。
思想
计算步骤
1.计算样本相关系数矩阵
2.计算R的特征值和特征向量
3.计算主成分贡献率和累计贡献率
4.写出主成分
根据系数分析各个主成分代表的意义,对于某个主成分而言,指标前面的系数越大,代表该指标对于该主成分的影响越大
实例
对下列数据主成分分析
matlab代码
load data1.mat
[n,p]=size(x);%n是样本个数p是指标数
%计算样本相关系数矩阵
R=corrcoef(x);
disp('样本相关系数矩阵为:')
disp(R)
%计算R的特征值和特征向量
[V,D]=eig(R);%V是特征向量矩阵D是特征值构成的对角矩阵
%计算主成分的贡献率和累计贡献率
lambda=diag(D);%diag得到矩阵主对角线的值,形成列向量
lambda=(lambda(end:-1:1))';%可以将特征值向量大小反向排序,默认是从小到大,转置为行向量
%贡献率
contributionRate=lambda/sum(lambda);
%累计贡献率
CumContributionRate=cumsum(lambda)/sum(lambda);
disp('特征值为:')
disp(lambda)
disp('贡献率:')
disp(contributionRate)
disp('累计贡献率:')
disp(CumContributionRate)
disp('与特征值对应的特征向量矩阵:')
V=rot90(V)';
disp(V)
结果
相关系数矩阵
结果数据整合
对结果解释
从上表可以看出,前两个和前三个主成分的累计贡献率分别达到80.6%和 87.8%,第一主成分F1在所有变量(除在x2上的载荷稍偏小外)上都有近似相等的 正载荷,反映了综合消费性支出的水平,因此第一主成分可称为综合消费性支出成分。第二主成分F2在变量x2上有很高的正载荷,在变量x4上有中等的正载荷,而在其余变量上有负载荷或很小的正载荷。可以认为这个主成分度量了受地区气候影响的消费性支出(主要是衣着,其次是医疗保健)在所有消费性支出中占的比重(也可理解为一种消费倾向),第二主成分可称为消费倾向成分。第三主成分很难给出明显的解释,因此我们只取前面两个主成分。
还可以计算主成分的值
数据先标准化
%对数据x标准化为X
X=zscore(x); % matlab内置的标准化函数(x-mean(x))/std(x)
% 计算主成分的值
m =input('请输入需要保存的主成分的个数: ');
F = zeros(n,m); %初始化保存主成分的矩阵(每一列是一个主成分)
for i = 1:m
ai = V(:,i)'; % 将第i个特征向量取出,并转置为行向量
Ai = repmat(ai,n,1); % 将这个行向量重复n次,构成一个n*p的矩阵
F(:, i) = sum(Ai .* X, 2); % 注意,对标准化的数据求了权重后要计算每一行的和
end
结果
拓展
主成分分析还可以用于聚类,回归分析,其中回归分析可以解决多重共线性的影响。