主成分分析——基于奇异值分解的数据降维方法

本文介绍了主成分分析(PCA)作为数据降维的方法,其核心是奇异值分解(SVD)。PCA通过线性变换最大化方差,减少数据相关性,实现维度降低。文章详细讲解了SVD的数学原理,PCA的步骤,以及PCA在数据压缩、特征提取和数据可视化等领域的应用,并提供了源代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主成分分析(Principal Component Analysis,简称PCA)是一种常用的数据降维方法,通过线性变换将原始数据映射到一个新的坐标系中,使得数据在新的坐标系下具有最大的方差。在这个新的坐标系下,数据之间的相关性减小,实现了对数据维度的降低。而PCA的核心数学原理则是基于奇异值分解(Singular Value Decomposition,简称SVD)。本文将详细介绍主成分分析的原理和应用,并提供相应的源代码。

一、奇异值分解(Singular Value Decomposition,SVD)

奇异值分解是线性代数中的一个重要概念,可以将一个矩阵分解为三个矩阵的乘积。设A是一个m×n的矩阵,那么它的奇异值分解可以表示为:

A = UΣV^T

其中,U是一个m×m的正交矩阵,Σ是一个m×n的对角矩阵,对角线上的元素称为奇异值,通常按照从大到小排列,V^T是一个n×n的正交矩阵的转置。

二、主成分分析的原理

主成分分析的目标是将原始的高维数据投影到一个新的低维空间中,以尽量保留原始数据的信息。具体步骤如下:

  1. 标准化数据:对原始数据进行标准化处理,使得各个特征具有相同的尺度。

  2. 计算协方差矩阵:计算标准化后的数据的协方差

### SVD 奇异值分解与 PCA 的关系 SVD 和 PCA 是两种密切相关的线性代数方法,在数据处理和机器学习领域有着广泛的应用。尽管它们的目标不同,但在某些情况下可以互换使用。 #### 关系 - **数学基础** PCA 可以通过 SVD 实现[^1]。具体来说,对于一个数据中心化的矩阵 \( X \),其协方差矩阵可以通过 \( C = XX^T / (n-1) \) 计算得到。PCA 的目标是从协方差矩阵中提取最大方差的方向作为主成分。如果直接对协方差矩阵进行特征值分解,则会面临较大的计算开销;而通过对原始数据矩阵 \( X \) 进行 SVD 分解,可以直接获得主成分方向及其对应的奇异值平方根[^2]。 - **过程** 在实现 PCA 时,通常先利用 SVD 对输入数据矩阵进行分解,从而简化后续操作并提升效率。因此可以说,SVD 提供了一种高效的方式去完成 PCA 中的核心运算任务——寻找主要变化方向[^3]。 --- ### 区别 | 特性 | SVD | PCA | |--------------------|------------------------------|-----------------------------| | 定义 | 将任意实数值矩阵分解成三个独立部分:左奇异向量U、右奇异向量V以及中间的奇异值Σ组成的对角阵 | 寻找能够解释最多数据变异性的正交基底 | | 输入需求 | 不需要预处理 | 需要中心化(均值归零)的数据 | | 输出结果形式 | U,V,S | 主成分得分及对应载荷 | 虽然两者都涉及到了度的概念,但是他们的出发点并不相同:SVD更关注于如何重构原矩阵;而PCA则专注于找到新的坐标轴使得投影之后的信息损失最小. --- ### 应用场景对比 #### SVD 的典型应用场景 - 文本挖掘中的潜在语义索引(LSI),用于发现文档集合内部隐藏的主题结构. - 推荐系统里用来预测用户可能感兴趣的商品列表. - 图像压缩等领域也有广泛应用实例存在. #### PCA 的常见用途 - 生物信息学研究基因表达谱分析过程中经常采用此法来识别关键变量.[^1] - 数据可视化方面特别适合把多空间映射到二平面上以便观察样本间关系模式. - 工程控制或者金融风险评估等方面也常借助它来进行噪声过滤或是异常检测等工作流程优化. ```python import numpy as np from sklearn.decomposition import PCA from scipy.linalg import svd # 构造随机数据集 np.random.seed(0) data = np.random.randn(100, 5) # 使用 SVD 方法手动实现 PCA u, s, vt = svd(data - data.mean(axis=0)) explained_variance_ratio_svd = (s ** 2) / np.sum((data.std(ddof=1)) ** 2 * (len(data)-1)) # 使用 scikit-learn 的 PCA 类库函数验证 pca = PCA() transformed_data_pca = pca.fit_transform(data) explained_variance_ratio_sklearn = pca.explained_variance_ratio_ print("Explained Variance Ratio via SVD:", explained_variance_ratio_svd[:2]) print("Explained Variance Ratio via Sklearn PCA:", explained_variance_ratio_sklearn[:2]) ``` 上述代码展示了如何分别运用 `scipy` 的 SVD 函数和 `sklearn` 的 PCA 模块执行相同的工作,并比较两者的输出一致性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值