PCA

PCA(主成分分析)相关内容。

0. PCA 解决的是什么问题?(Why PCA)

高维数据普遍存在:

  1. 维度相关性(correlation)高
  2. 噪声多,结构难以观察
  3. 后续模型(线性回归 / 分类)受冗余维度影响严重
  4. 需要降维以降低复杂度,提升可视化、计算效率、泛化性

目标:

找到一组新的正交方向,使
1)每个方向的”信息量”尽可能大,
2)方向之间互不相关,
3)用少量方向即可近似原数据。

这组方向就是 主成分(principal components)


1. PCA 数据预处理

数据集:

中心化:

理由:

  • 使方差 = 二阶矩:
  • 协方差矩阵简化为
  • 否则均值会使整个分析复杂化

定义数据矩阵:

协方差矩阵(样本估计):

协方差矩阵的性质

  • 对称矩阵
  • 半正定矩阵:对任意 ,有
  • 的特征值都是非负实数
  • 的特征向量两两正交

2. PCA 的核心数学目标

2.1 投影的定义

给定方向向量 (列向量,),将样本 投影到 上:

约定:本文统一采用 的写法,即行向量乘列向量得标量。

2.2 为什么用方差衡量信息量?

直观理解

  • 如果所有点投影到同一位置(方差 = 0),则该方向无法区分数据
  • 投影越分散(方差越大),该方向携带的信息越多

数学表述:方向 的信息量 = 投影后的方差

由于数据已中心化,,故:

2.3 投影方差的矩阵形式

由于 是常量,可以提出期望:

这是 PCA 的核心公式,后面所有推导都等价于最大化它。

2.4 PCA 的优化问题

约束条件:为避免 无限增大导致方差无限大,需要约束

于是 PCA 的优化问题是:

后续主成分需要加入正交约束(保持方向彼此正交):


3. PCA 的”三大严格推导方式”

3.1 推导一:最大化投影方差(Rayleigh Quotient)

1) 一维主成分的详细推导

Step 1: 建立优化问题

我们希望找到一个单位向量 ,使得数据在该方向上的投影方差最大:

Step 2: 构造拉格朗日函数

引入拉格朗日乘子 处理约束:

Step 3: 求导并设为零

求导,需要用到矩阵求导公式:

  • (因为 对称)

因此:

化简得:

这正是特征值问题! 必须是 的特征向量, 是对应的特征值。

Step 4: 确定哪个特征向量是最优解

代入目标函数:

因此,投影方差 = 特征值

为了最大化方差,应选择最大特征值 对应的特征向量

Step 5: Rayleigh Quotient 的理解

定义 Rayleigh 商:

对于任意非零向量

  • 的最大值 = (最大特征值)
  • 的最小值 = (最小特征值)
  • 极值点恰好是对应的特征向量

直观理解:Rayleigh 商衡量的是向量 在矩阵 作用下的”放大程度”。


2) 第二主成分的推导

Step 1: 添加正交约束

第二主成分 需要满足:

  1. 单位长度:
  2. 与第一主成分正交:

优化问题:

Step 2: 拉格朗日函数

Step 3: 求导

Step 4: 利用正交性消除

左乘

由于 对称且 是特征向量:

得:,即

Step 5: 回代得特征方程

也是 的特征向量!由于需与 正交, 必须对应第二大特征值


3) K 维主成分的一般推导

矩阵形式的优化问题

寻找矩阵 ,满足正交约束:

目标函数(总方差):

为什么是迹?

利用特征分解求解

的特征分解为:

其中 是正交矩阵,

关键引理:对于任意满足 的矩阵

等号成立当且仅当 的列张成与 相同的子空间。

证明思路

,其中 满足 (因为 正交)。

,则:

由于 $Q^\top Q = IK\sum{j=1}^K q_{ij}^2 \leq 1\leq 1$)。

为最大化上式,应让大的 $\lambdaiq{ij}^2Q使K$ 行非零。

最终结论

最优投影矩阵由前 大特征值对应的特征向量组成。


3.2 推导二:最小化重建误差(Reconstruction View)

这一视角将 PCA 理解为一个最佳线性近似问题:用低维子空间来近似高维数据。

(1) 一维情形的详细推导

Step 1: 定义重建过程

给定单位方向 ,对数据点 的处理:

  1. 投影:计算在 方向的坐标 (标量)
  2. 重建

几何理解 在通过原点、方向为 的直线上的正交投影。

Step 2: 计算单个点的重建误差

展开这个范数:

Step 3: 计算平均重建误差

分离为两部分:

因此:

Step 4: 等价性

最小化重建误差 最大化投影方差!

直观理解

  • 总能量 = 保留的能量 + 丢失的能量
  • 保留越多( 大) 丢失越少( 小)

(2) K 维情形的详细推导

Step 1: 定义 K 维投影空间

,满足

的列张成一个 维子空间。

Step 2: 投影矩阵

投影到 张成的子空间的投影矩阵为:

投影矩阵的性质

  • (幂等性)
  • (对称性)

Step 3: 重建过程

其中 是低维表示。

Step 4: 计算重建误差

(正交补空间的投影),则:

(利用了 $P\perp^2 = P\perp, P\perp^\top = P\perp$)

Step 5: 平均误差的矩阵形式

利用迹的线性性:

因此:

Step 6: 最优解

由推导一的结论,最优解为:

信息保留率

这个比例常用于选择 的大小(如保留 95% 的方差)。


3.3 推导三:SVD 视角(最工程、最稳定)

这一视角直接从数据矩阵出发,利用奇异值分解建立与 PCA 的联系。


(1) SVD 回顾

任意矩阵 可分解为:

其中:

  • :左奇异向量矩阵,
  • :对角矩阵(奇异值
  • :右奇异向量矩阵,

经济型 SVD(当 ):

其中


(2) SVD 与协方差矩阵的关系

协方差矩阵

(利用了

,则:

其中 ,满足:

核心结论

  • 的特征向量 = 的左奇异向量
  • 的特征值 = 奇异值的平方除以

因此,PCA 主成分方向 = SVD 的左奇异向量


(3) 最佳低秩近似(Eckart-Young 定理)

定理:在 Frobenius 范数下, 的最佳 rank- 近似为:

其中 是前 个奇异值对应的部分。

近似误差

与 PCA 的联系

PCA 的重建:

可以验证,这与 SVD 低秩近似等价:


(4) 为什么 SVD 比特征分解更稳定?

方面特征分解SVD
计算对象直接对
数值稳定性计算 会放大误差更稳定
条件数
奇异情况可能数值不稳定自然处理秩亏缺

Dual PCA(当 ):

计算 的特征分解(比 小得多):

然后恢复左奇异向量:


(5) SVD 实现 PCA 的算法流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
输入: 数据矩阵 X ∈ R^{D×N},目标维度 K

1. 中心化
μ = mean(X, axis=1) # 每个特征的均值
X_centered = X - μ # 广播减去均值

2. SVD 分解
U, Σ, V^T = SVD(X_centered) # 完整 SVD

U_K, Σ_K, V_K^T = truncated_SVD(X_centered, K) # 截断 SVD(更高效)

3. 提取主成分
W = U[:, :K] # 前 K 个左奇异向量

4. 投影(降维)
Z = W^T @ X_centered # Z ∈ R^{K×N}

5. 重建(可选)
X_reconstructed = W @ Z + μ

输出:
- W: 主成分方向矩阵 (D × K)
- Z: 低维表示 (K × N)
- λ = σ²/N: 各主成分的方差(特征值)

4. PCA 的几何解释

4.1 椭球与主轴

协方差矩阵 定义了一个椭球:

椭球的主轴

  • 方向 = 的特征向量
  • 长度 ∝ (特征值的平方根)

PCA 找到的主成分就是这个椭球的主轴方向!

4.2 旋转到主轴坐标系

原始数据的协方差矩阵:

投影后 ,新坐标下的协方差:

对角矩阵! 这意味着:

  • 各主成分之间不相关
  • 个主成分的方差 =

4.3 最大方差方向的几何意义

想象数据点形成一个云团:

  • 第一主成分:云团最”长”的方向
  • 第二主成分:在与第一主成分垂直的平面内,最长的方向
  • 以此类推…
1
2
3
4
5
6
7
8
9
       PC1

| . . .
. . | . . . .
. . . | . . . . .
. . . . * . . . . . → PC2
. . . | . . . . .
. . | . . .
|

5. PCA 的实际应用

5.1 Python 实现

从零实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import numpy as np

def pca_from_scratch(X, n_components):
"""
X: 数据矩阵,形状 (n_samples, n_features)
n_components: 目标维度
"""
# 1. 中心化
mean = np.mean(X, axis=0)
X_centered = X - mean

# 2. SVD 分解
# X_centered: (N, D),需要转置使用我们的符号约定
U, s, Vt = np.linalg.svd(X_centered, full_matrices=False)

# 3. 主成分方向(Vt 的前 K 行,即 V 的前 K 列)
components = Vt[:n_components] # (K, D)

# 4. 投影
X_transformed = X_centered @ components.T # (N, K)

# 5. 计算解释方差比
explained_variance = (s ** 2) / (X.shape[0] - 1)
explained_variance_ratio = explained_variance / explained_variance.sum()

return {
'components': components,
'transformed': X_transformed,
'explained_variance': explained_variance[:n_components],
'explained_variance_ratio': explained_variance_ratio[:n_components],
'mean': mean
}

# 使用示例
np.random.seed(42)
X = np.random.randn(100, 5) @ np.array([[3, 0, 0, 0, 0],
[0, 2, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0.5, 0],
[0, 0, 0, 0, 0.1]])
result = pca_from_scratch(X, n_components=2)
print("解释方差比:", result['explained_variance_ratio'])

使用 scikit-learn

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

# 数据预处理
X = np.random.randn(100, 10)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# PCA
pca = PCA(n_components=0.95) # 保留 95% 方差
X_pca = pca.fit_transform(X_scaled)

print(f"原始维度: {X.shape[1]}")
print(f"降维后维度: {X_pca.shape[1]}")
print(f"各主成分解释方差比: {pca.explained_variance_ratio_}")
print(f"累计解释方差比: {np.cumsum(pca.explained_variance_ratio_)}")

5.2 应用场景

应用说明
数据可视化将高维数据降至 2D/3D 进行可视化
噪声过滤去除小特征值对应的成分(噪声)
特征提取作为机器学习的预处理步骤
数据压缩图像压缩、信号压缩
异常检测重建误差大的点可能是异常

6. PCA 的局限性与延伸

6.1 PCA 的局限性

局限性说明
线性假设只能捕捉线性关系
方差假设假设大方差 = 重要信息
正交约束主成分必须正交,可能不自然
对异常值敏感基于协方差矩阵,受极端值影响大
对尺度敏感不同尺度的特征会影响结果

6.2 延伸算法

(1) Probabilistic PCA (PPCA)

概率模型视角:

优势

  • 可以处理缺失值
  • 提供概率解释
  • 可用 EM 算法求解

(2) Sparse PCA

加入稀疏性约束:

优势:主成分更具可解释性(只涉及少数原始特征)

1
2
3
4
from sklearn.decomposition import SparsePCA

spca = SparsePCA(n_components=2, alpha=0.1)
X_spca = spca.fit_transform(X)

(3) Incremental PCA

处理大规模数据,分批计算:

1
2
3
4
5
6
from sklearn.decomposition import IncrementalPCA

ipca = IncrementalPCA(n_components=2, batch_size=100)
for batch in data_generator:
ipca.partial_fit(batch)
X_ipca = ipca.transform(X)

(4) Robust PCA

分解为低秩 + 稀疏:

用于去除稀疏噪声/异常值。


7. 总结

7.1 三种推导的统一

视角目标函数最优解
最大方差 的最大特征向量
最小重建误差$\min \X - \hat{X}\^2$ 的最大特征向量
SVD 低秩近似$\min \X - \hat{X}\_F$ 的前 个左奇异向量

三者等价!

7.2 核心公式速查

概念公式
投影
重建
投影方差
重建误差$$\x - \hat{x}\^2 = \sum_{i>K} \lambda_i$$
方差保留比
SVD 与特征值关系