主成分分析(Principal Component Analysis, PCA) 数学原理 与 MATLAB代码复现
主成分分析(Principal Component Analysis, PCA)介绍
主成分分析(PCA)是一种广泛应用的统计技术,主要用于数据的降维和特征提取。它通过正交变换将一组可能存在相关性的变量转换为一组线性不相关变量,这些新的变量被称为主成分。
其中两个关键基本概念
-
主成分:PCA的目标是找到数据集中方差最大的方向,并将数据投影到这个方向上,得到第一个主成分。随后,在与第一个主成分正交的方向上找到方差次大的方向,得到第二个主成分,以此类推。
-
降维:通过选择前几个主成分,可以保留数据集中的大部分信息,同时减少数据的维度,从而简化后续的数据处理和分析。
论文中常利用PCA分析高维数据的分布与特征聚类效果 、或用于降维,优化后续模型的表现
数学原理
主成分分析的设计初衷是为了解决部分数据间线性相关性较强,参数冗余的问题,将数据的向量空间重新投影至一个“高效空间”,即主成分空间(以下简称为:“这一目标”)。
主成分的数学思想:为了实现这一目标,主成分降维后的数据应达到以下两个要点:
为解决这一需求,学者们巧妙地利用了协方差矩阵来构建这一问题的解决方法
其中,Z 是标准化后的数据矩阵,n 是样本数。协方差矩阵C是一个对称矩阵,其对角线上的元素是各特征的方差,非对角线上的元素是各特征之间的协方差。
为什么要选择利用协方差矩阵解决这一问题?
协方差矩阵有许多优秀的性质帮我们达到以上两项要求:
• 协方差矩阵 对角线上的元素分别是向量的方差 ,表示该维度数据的离散程度;• 而非对角线元素表示不同维度数据之间的协方差,即它们的相关性。因此,这一目标,也就可以表述为让变化后数据的协方差矩阵的迹尽可能的大,同时非对角线元素为0.
说到让数据的协方差矩阵的迹尽可能的大,同时非对角线元素为0.你会想到什么?那当然是矩阵的特征值与特征向量矩阵。
回顾一下在线性代数中矩阵特征值的性质:
于是:
对协方差矩阵C进行特征值分解,可得到特征值λ1,λ2,…,λp(按大小排序)和对应的特征向量v1,v2,…,vp。这些线性无关的正交向量,就是评估该数据分布的最优空间,也就是PCA的主成分空间。
我们手算时常用的特征值λ求解方程:
但协方差矩阵通常是正定矩阵,所以在计算时常用奇异值分解SVD来等价特征值求解,减少计算量。
SVD的计算量通常与数据的秩成正比,而秩通常远小于数据的维度。这意味着SVD可以在不计算整个协方差矩阵的情况下找到数据的主成分,从而显著提高计算效率。
SVD:
变化:
其中:; ;
其中,A就是我们输入的协方差矩阵,Order意味将矩阵按特征值(向量拥有的维度)进行由大到小排列。Σ(sigma)是由降序排列的非负对角线元素组成的m×n矩形对角矩阵,这些对角线元素称为奇异值-特征值。
得到特征值λ1,λ2,…,λp和对应的特征向量v1,v2,…,vp后,按大小排序。特征值表示每个特征向量的方向上数据的方差大小,而特征向量则表示这些方向。用选定的k个特征向量构造矩阵P,再将原始数据投影到P所构成的空间中,得到降维后的数据。
对于不同的特征向量(主成分空间),我们可以用主成分贡献率(Contributing rate of principal component)进行评估:
算公式为:
其中,αi表示第i个主成分的贡献率,λi表示第i个主成分的特征值,表示所有特征值之和。
注:
累计贡献率:它是指主成分前k个特征值之和在全部特征值之和的比率。一般选择前k个主成分,使其累计方差贡献率达到一定的阈值(如85%-95%),用前k个主成分代替原来的n个变量,这样既能保证信息含量基本不变,又能实现数据降维和各数据因子之间独立的目的。
MATLAB复现代码
function [coeff, score, latent] = myPCA(X)
% 输入:
% X - 原始数据矩阵,每一行是一个数据样本,每一列是一个特征
%
% 输出:
% coeff - 主成分系数矩阵(即特征向量)
% score - 转换后的数据(即主成分得分)
% latent - 每个主成分的特征值(即解释的方差)
% 第一步:数据中心化
X_mean = mean(X);
X_centered = X - X_mean;
% 第二步:计算协方差矩阵
covMatrix = cov(X_centered);
% 第三步:计算协方差矩阵的特征值和特征向量
[V, D] = eig(covMatrix);
% 特征值是对角矩阵,提取对角线上的特征值
latent = diag(D);
% 第四步:将特征值从大到小排序,并相应调整特征向量
[latent, idx] = sort(latent, 'descend');
coeff = V(:, idx);
% 第五步:计算主成分得分
score = X_centered * coeff;
end
% 示例使用
% 假设我们有一个数据矩阵X,其中每一行是一个样本,每一列是一个特征
X = [2.5, 2.4;
0.5, 0.7;
2.2, 2.9;
1.9, 2.2;
3.1, 3.0;
2.3, 2.7;
2, 1.6;
1, 1.1;
1.5, 1.6;
1.1, 0.9];
% 调用自定义的PCA函数
[coeff, score, latent] = myPCA(X);
% 显示结果
disp('主成分系数矩阵:');
disp(coeff);
disp('主成分得分:');
disp(score);
disp('每个主成分的特征值:');
disp(latent);
可直接使用官方函数,更加方便:[coeff,score,latent] = pca(___)
相关参考:matlab PCA(Principal Component Analysis)主成分分析作图 2D|3D带有参数指向 案例_主成分分析图用什么软件制作-CSDN博客