主成分分析法(PCA)及MATLAB实现

本文详细介绍了主成分分析PCA的概念,包括其作为线性降维方法的目标和优势。PCA步骤包括特征去均值、求协方差矩阵、计算特征值和特征向量,以及数据投影。此外,还提供了MATLAB实现PCA的代码示例,展示了如何计算主成分贡献率和累计贡献率,并提取所需主成分。
摘要由CSDN通过智能技术生成

目录

1. 主成分分析概念:

 2. 主成分分析法步骤:

第一步:对所有特征进行中心化:去均值

第二步:求协方差矩阵C

第三步:求协方差矩阵C的特征值​编辑和相对应的特征向量​编辑

第四步:将原始特征投影到选取的特征向量上,得到降维后的新K维特征

 3. 主成分分析法MATLAB实现:


1. 主成分分析概念:

        主成分分析算法(PCA)是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大(方差最大),以此使用较少的数据维度,同时保留住较多的原数据点的特性。一般来说,当研究的问题涉及到多变量且变量之间存在很强的相关性时,我们可考虑使用主成分分析的方法来对数据进行简化。

降维具有的优点:

  • 使得数据集更易使用
  • 降低算法的计算开销
  • 去除噪声
  • 使得结果容易理解

        假设有n个样本,p个指标,则可构成n*p的样本矩阵x:

 例如:此图中有10个样本,2个指标,可以构成10*2的样本矩阵

 2. 主成分分析法步骤:

第一步:对所有特征进行中心化:去均值

   求每一个特征的平均值(按列求取),然后对于所有的样本,每一个特征都减去自身的均值。

 \bar{x_{1}}=\frac{1}{M}\sum_{i=1}^{M}x_{1}^{i}=\frac{1+2+2.5+0.3+6+...+0.5}{10}=2.31

\bar{x_{2}}=\frac{1}{M}\sum_{i=1}^{M}x_{2}^{i}=\frac{32+45+7+...+10}{10}=20.1

第二步:求协方差矩阵C

        求协方差矩阵

        C =\begin{bmatrix} cov(x1,x1) & cov(x1,x2)\\ cov(x2,x1) &cov(x2,x2) \end{bmatrix}

第三步:求协方差矩阵C的特征值\lambda和相对应的特征向量u

        求协方差矩阵C的特征值\lambda和相对应的特征向量u

        特征值 λ 会有 N个,每一个 λ  对应一个特征向量 u,将特征值 λ 按照从大到小的顺序排序,选择最大的前k,并将其相对应的k个特征向量拿出来,我们会得到一组 { ( λ 1 , u 1 ) , ( λ 2 , u 2 ) , . . . , ( λ k , u k ) } 。本例中原始特征只有2维,我在选取 λ 的时候,令 k = 1,选择最大的 λ 1 和 其 对 应 的 u 1 和其对应的u1​。

第四步:将原始特征投影到选取的特征向量上,得到降维后的新K维特征

选取最大的前k个特征值和相对应的特征向量,并进行投影的过程,就是降维的过程。对于每一个样本 X^{i},原来的特征是 (x_{1}^{i},x_{2}^{i},x_{3}^{i},...x_{n}^{i})^{T},投影之后的新特征是  (y_{1}^{i},y_{2}^{i},y_{3}^{i}...y_{k}^{i})^{T},新特征的计算公式如下:

\begin{bmatrix} y_{1}^{i}\\ y_{2}^{i} \\ . \\ . \\ y_{k}^{i} \end{bmatrix}=\begin{bmatrix} u_{1}^{T}.(x_{1}^{i},x_{2}^{i},x_{3}^{i},...,x_{n}^{i})^{T}\\ u_{2}^{T}.(x_{1}^{i},x_{2}^{i},x_{3}^{i},...,x_{n}^{i})^{T} \\ . \\ . \\ u_{k}^{T}.(x_{1}^{i},x_{2}^{i},x_{3}^{i},...,x_{n}^{i})^{T} \end{matrix}

 主成分分析法的原理分析在此处不涉及,感兴趣的友友可以看这一篇文章:

PCA:详细解释主成分分析_lanyuelvyun的博客-CSDN博客_pca

 3. 主成分分析法MATLAB实现:

data1部分原数据:

省份食品衣着家庭设备医疗交通娱乐居住杂项
北京2959.19730.79749.41513.34467.871141.82478.42457.64
天津2459.77495.47697.33302.87284.19735.97570.84305.08
河北1495.63515.9362.37285.32272.95540.58364.91188.63
山西1406.33477.77290.15208.57201.5414.72281.84212.1
内蒙古1303.97524.29254.83192.17249.81463.09287.87192.96
辽宁1730.84553.9246.91279.81239.18445.2330.24163.86
吉林1561.86492.42200.49218.36220.69459.62360.48147.76
黑龙江1410.11510.71211.88277.11224.65376.82317.61152.85
上海3712.31550.74893.37346.935271034.98720.33462.03
江苏2207.58449.37572.4211.92302.09585.23429.77252.54
浙江2629.16557.32689.73435.69514.66795.87575.76323.36
安徽1844.78430.29271.28126.33250.56513.18314151.39
福建2709.46428.11334.12160.77405.14461.67535.13232.29
...........................
clear;clc
load data1.mat   % 主成分聚类
[n,p] = size(x);  % n是样本个数,p是指标个数

R = corrcoef(x);
disp('样本相关系数矩阵为:')
disp(R)
[V,D] = eig(R);  % V 特征向量矩阵  D 特征值构成的对角矩阵

%%计算主成分贡献率和累计贡献率
lambda = diag(D);  % diag函数用于得到一个矩阵的主对角线元素值(返回的是列向量)
lambda = lambda(end:-1:1);  % 因为lambda向量是从小大到排序的,我们将其调个头
contribution_rate = lambda / sum(lambda);  % 计算贡献率
cum_contribution_rate = cumsum(lambda)/ sum(lambda);   % 计算累计贡献率  cumsum是求累加值的函数
disp('特征值为:')
disp(lambda')  % 转置为行向量,方便展示
disp('贡献率为:')
disp(contribution_rate')
disp('累计贡献率为:')
disp(cum_contribution_rate')
disp('与特征值对应的特征向量矩阵为:')
% 注意:这里的特征向量要和特征值一一对应,之前特征值相当于颠倒过来了,因此特征向量的各列需要颠倒过来
%  rot90函数可以使一个矩阵逆时针旋转90度,然后再转置,就可以实现将矩阵的列颠倒的效果
V=rot90(V)';
disp(V)


%% 计算我们所需要的主成分的值
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

参考:清风数学建模

  • 49
    点赞
  • 209
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值