欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数模算法:主成分分析

程序员文章站 2022-05-22 14:12:57
...

引入

主成分分析是一种降维算法,它能将多个指标转换为少数几 个主成分,这些主成分是原始变量的线性组合,且彼此之间 互不相关,其能反映出原始数据的大部分信息。一般来说, 当研究的问题涉及到多变量且变量之间存在很强的相关性时, 我们可考虑使用主成分分析的方法来对数据进行简化。
在实际问题研究中,多变量问题是经常会遇到的。变量太多,无疑 会增加分析问题的难度与复杂性,而且在许多实际问题中,多个变量之 间是具有一定的相关关系的。 因此,人们会很自然地想到,能否在相关分析的基础上,用较少 的新变量代替原来较多的旧变量,而且使这些较少的新变量尽可能多地 保留原来变量所反映的信息? 事实上,这种想法是可以实现的,主成分分析方法就是综合处理这 种问题的一种强有力的工具。 主成分分析是把原来多个变量划为少数几个综合指标的一种统计 分析方法。

思想

数模算法:主成分分析
数模算法:主成分分析

计算步骤

数模算法:主成分分析
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

结果
数模算法:主成分分析

拓展

主成分分析还可以用于聚类,回归分析,其中回归分析可以解决多重共线性的影响。

相关标签: 数学建模