M个学生N个科目
.Python机器学习笔记:奇异值分解(SVD)算法 - 战争热诚 - 博客园
一步步教你轻松学奇异值分解SVD降维算法 | 白宁超的官网

✅ 问题1:SVD 降维是否直接基于奇异值矩阵?

不是单独只看奇异值矩阵(Σ),而是看整个分解:

降维是通过 截取前 个最大的奇异值及其对应的奇异向量 实现的:

  • 奇异值(Σ) 告诉我们每个主成分的重要性(信息量)
  • 右奇异向量(V_k) 定义了投影的方向(特征方向)
  • 左奇异向量(U_k) 表示样本在这些方向上的坐标

所以真正的降维过程是:

也可以写为:

Σ 只是衡量主成分重要性的量尺。


✅ 问题2:如何保证 SVD 正好求解了 PCA 的目标?

🎯 PCA 的优化目标

PCA 的目标是找到一个投影方向 ,使得原始数据 在这 个方向上投影后的方差最大化(也即信息保留最多):

也可以等价地理解为:最小化原始数据和重构数据之间的误差:

这个低秩逼近问题正好由 SVD 的前 项截断解决!

最小化误差 不一定方差最大

📌 数学连接点:协方差矩阵特征分解

  1. 假设数据 是中心化的(每列减去均值)
  2. 则 PCA 是对协方差矩阵做特征分解:

其中:

  • :是特征向量矩阵(PCA 的方向)
  • :是特征值矩阵(对应方差)
  1. 这和 SVD 中的:

对比发现:

  • 就是协方差矩阵的特征值(乘了 或 的比例常数)
  • 是 PCA 的投影方向
  • 所以 PCA 实际上就是对 做特征分解,而这正好被 SVD 求出来了!

等价归纳

对象SVDPCA
输入任意矩阵 零均值矩阵
输出协方差矩阵的特征向量(= )
主成分方向(右奇异向量)协方差矩阵的特征向量
主成分大小(奇异值平方)协方差矩阵的特征值
降维坐标同上

所以,只要数据中心化过,PCA 就等价于 SVD 的前 项截断!

转置后,PCA 所需的列均值为零可能部分满足(取决于你中位数化是否改变了列均值),但严格来说,为保证协方差矩阵准确,最好再次按列中心化。

如果不中心化,直接用SVD得到的结果通常不是我们想要的PCA。

奇异值分解(SVD)原理与在降维中的应用 - 刘建平Pinard - 博客园

下面我会把你真正关心的核心问题彻底解释清楚:

当矩阵 A 不是方阵(例如 PCA 的样本×基因矩阵),我没有传统的特征值和特征向量,那用 SVD 得到的 U、V 是谁的“特征向量”?我该如何画载荷图?

这是 PCA 和 SVD 中最容易造成混淆的点,我会用最清晰的数学和生物信息学视角解开。


非方阵 A 本身没有特征值,但 AᵀA 和 AAᵀ 是方阵,有特征向量。
SVD 的 U 和 V 就是这两个方阵的特征向量。

更明确:


✔ V 的列 = AᵀA(基因 × 基因协方差矩阵)的特征向量

= PCA 载荷(loadings)

✔ U 的列 = AAᵀ(样本 × 样本协方差矩阵)的特征向量

= 样本在主成分方向上的投影(scores)

✔ Σ² 的对角线 = AᵀA 的特征值(即 PCA 的特征值)


🧠 为什么会这样?(但我用简单方式解释)

设你的数据矩阵是:

  • n = 样本数
  • p = 基因/蛋白/特征数

通常 p >> n,不是方阵,所以 A 没有特征值分解。

但是:

矩阵维度用途特征向量
(A^TA)p×p特征协方差V(载荷)
(AA^T)n×n样本协方差U(得分)

SVD:

两边左乘 得:

注意结构:

  • 这是标准的 特征值分解
  • 左边是基因×基因协方差矩阵
  • 右边 V 是特征向量

所以 V 的列就是 PCA 的 loadings。

同理:

所以:

  • U 的列 = 样本对应的 PCA 得分方向(scores)

📌 最终答案(用于作图):

✔ 载荷图(loadings plot)使用的向量 = SVD 的 V

你画:

  • PC1 loadings → V[,1]
  • PC2 loadings → V[,2]

这和 PCA 得到的特征向量完全一致(只是符号 ± 可交换)。


📌 样本得分图(scores plot)使用 = SVD 的 UΣ

PCA scores =

所以:

  • PC1 scores → U[,1] * Σ$$
    1
# 🧬 **为什么这对生物学非常重要?** 在蛋白组 / 转录组 / 修饰组中: * **V = 哪些蛋白/基因贡献了 PC1?** * **UΣ = 哪些样本在 PC1 方向上变化?** 例如: * PC1 loadings 中 pAKT、pEGFR 很高 → 表示 PI3K pathway 驱动样本分群 * PC2 loadings 中 HSP70、HSP90 很高 → heat shock response 如果你只用 PCA 的 eigenvectors,你得到的就是 V(载荷)。 如果你用 SVD,你也能直接得到 V。