Math-03.线性代数-10.PCA与协方差

本页为 PCA(Principal Component Analysis,主成分分析)的实践专篇:从协方差矩阵特征分解到 SVD 实现,衔接降维与特征工程。

段末注释PCA 在正交变换下寻找保留最大方差的前 $K$ 个方向;白化(whitening)在 PCA 基础上再缩放使各维单位方差。

系列入口00.系列规划 | 前置:04 特征值05 SVD


1. 问题与直观(D1)

图 1 PCA:找最大方差方向

数据 $X \in \mathbb{R}^{n \times d}$($n$ 样本,$d$ 特征),目标:找正交方向 $\mathbf{w}_1,\ldots,\mathbf{w}_K$ 使投影后方差最大、方向互不相关。

第一主成分:

$$
\mathbf{w}1 = \arg\max{|\mathbf{w}|=1} \mathrm{Var}(X\mathbf{w}) = \arg\max_{|\mathbf{w}|=1} \mathbf{w}^\top \Sigma \mathbf{w}
$$

解为 $\Sigma$ 的最大特征值对应特征向量(04 特征值)。


2. 算法步骤(D3)

图 2 PCA 流程

  1. 中心化:$\tilde{X} = X - \bar{X}$
  2. 协方差:$\Sigma = \frac{1}{n-1}\tilde{X}^\top \tilde{X}$(或相关矩阵 $R$ 若已标准化)
  3. 特征分解:$\Sigma = Q \Lambda Q^\top$,按 $\lambda_1 \ge \lambda_2 \ge \cdots$ 排序
  4. 投影:$Z = \tilde{X} Q_K$,$Q_K$ 为前 $K$ 列

解释方差比

$$
\text{EVR}k = \frac{\lambda_k}{\sum{j=1}^d \lambda_j}
$$

SVD 等价:对 $\tilde{X} = U \Sigma_s V^\top$,$V$ 的列即主成分方向;$n \ll d$ 时 SVD 更省。


3. 白化(D3)

$$
Z_{\mathrm{white}} = \tilde{X} Q_K \Lambda_K^{-1/2}
$$

投影后各维方差为 1、不相关。用于:

  • 某些分类器前置(如 LDA 相关)
  • 对比学习、某些 GAN 管线
  • 注意:白化会放大噪声方向(小 $\lambda_k$)

4. 场景与选型(D7)

图 3 PCA 与兄弟方法

方法 线性/非线性 保留信息 链接
PCA 线性 全局方差 本文
t-SNE 非线性 局部邻域 t-SNE 文章
UMAP 非线性 局部+部分全局 UMAP 文章
Filter 相关 与 $Y$ 相关 Math-02/20

适用 PCA:高维连续特征、可视化前处理、多重共线性压缩、组学 PCA 图。

不适用:类别边界非线性、需保留局部流形(用 t-SNE/UMAP);标签监督降维(用 LDA/监督方法)。


5. 局限与误用(D8)

图 4 局限

误用 说明
未中心化 第一 PC 常被均值偏移主导
量纲不一直接 PCA 大单位特征主导 → 先标准化
在测试集上 fit PCA 数据泄漏;只在 train fit
$K$ 随意选 看 scree plot / 累计 EVR
PCA 图当聚类结论 PC1/2 未必对应生物学分组

酶学/生信:PCA 常用于突变体活性矩阵、表达谱;与 酶改造-06 的 CV、特征筛选配合。


6. sklearn 示例(D12)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

X_train = np.random.randn(200, 50)
X_test = np.random.randn(50, 50)

pipe = Pipeline([
("scale", StandardScaler()),
("pca", PCA(n_components=10, random_state=0)),
])
Z_train = pipe.fit_transform(X_train)
Z_test = pipe.transform(X_test) # 只用 train 参数

pca = pipe.named_steps["pca"]
print("解释方差比:", pca.explained_variance_ratio_)
print("累计:", pca.explained_variance_ratio_.cumsum())

7. 小结

PCA = 协方差谱 + 方差最大投影;实现优先 SVD。非线性可视化见 t-SNE/UMAP;DL 表征见 20 Attention+LoRA

系列导航04 特征值 | 20 LoRA

-------------本文结束感谢您的阅读-------------