← 返回目录

第25章 主成分分析

Principal Component Analysis

以概率统计、几何、矩阵分解、优化为视角

"掌握我们的命运的不是星象,而是我们自己。"

— 威廉·莎士比亚 (William Shakespeare) | 英国剧作家 | 1564 ~ 1616

🐍 Python工具箱

numpy.cov()
计算协方差矩阵
numpy.linalg.eig()
特征值分解
numpy.linalg.svd()
奇异值分解
sklearn.decomposition.PCA()
主成分分析函数
seaborn.heatmap()
绘制热图
seaborn.pairplot()
绘制成对分析图
25.1

再聊主成分分析

Principal Component Analysis Revisited

主成分分析 (Principal Component Analysis, PCA) 是重要的降维工具。PCA 可以显著减少数据的维数,同时保留数据中对方差贡献最大的成分。

💡 核心思想

通过线性变换将高维数据映射到低维空间中,使得映射后的数据能够尽可能地保留原始数据的信息,同时去除噪声和冗余信息,从而更好地描述数据的本质特征。

🎯 应用场景

  • • 降维:减少数据维度
  • • 可视化:多维数据投影到2D/3D
  • • 特征提取:提取主要特征
  • • 去噪:过滤冗余信息

📚 相关主题

  • • 协方差矩阵
  • • 特征值分解
  • • 奇异值分解 (SVD)
  • • 主成分回归 (PCR)

无监督学习

主成分分析是重要的无监督学习 (unsupervised learning) 算法。无监督学习是一种机器学习方法,它处理没有标签或输出值的数据。

无监督学习的主要类型:

🔵 聚类 (Clustering)

将相似的数据点分组到不同的簇中,将数据分割为具有内在结构的不同子集。

📉 降维 (Dimensionality Reduction)

从高维数据中提取出具有代表性的低维特征,减少计算复杂度、提高可视化效果。PCA就是常用的降维算法。

⭐ 异常检测 (Outlier Detection)

检测数据集中的异常数据点,这些数据点与其它数据点存在显著差异。马氏距离常用来发现离群值。

🔗 关联规则挖掘 (Association Rules)

在大规模数据集中寻找频繁出现的关联项集,发现数据中的相关性和关联性。

PCA一般步骤

如下图所示,PCA 的一般步骤如下:

📋 详细步骤说明

1
计算协方差矩阵

计算原始数据 Xn×D 的协方差矩阵 ΣD×D

2
特征值分解

对 Σ 特征值分解,获得特征值 λi 与特征向量矩阵 VD×D

3
特征值排序

对特征值 λi 从大到小排序,选择其中特征值最大的 p 个特征向量

4
降维投影

将原始数据(中心化数据)投影到这 p 个正交向量构建的低维空间中,获得得分 Zn×p

⚠️ 数据预处理

在第一步之前,通常需要对数据进行预处理:

  • • 标准化 (Standardization):计算 Z 分数,防止不同特征上方差差异过大
  • • 中心化 (Centering):去均值,将数据质心移到原点,E(Xc) = 0

💡 标准化数据的协方差矩阵实际上就是原数据的相关性系数矩阵。

主成分方向可视化

在二维空间中,我们可以直观地看到主成分的方向。第一主成分 (PC1) 指向数据方差最大的方向,第二主成分 (PC2) 与PC1正交,指向次大方差方向。

方差贡献与主成分选择

🔑 核心概念:迹与总方差

协方差矩阵 Σ 的迹 trace(Σ) 等于特征值方阵 Λ 的迹 trace(Λ):

trace(Σ) = σ₁² + σ₂² + ... + σ_D² = λ₁ + λ₂ + ... + λ_D = trace(Λ)

从统计学角度来讲,λj 是第 j 个主成分所贡献的方差。

📊 个体方差贡献

第 j 个特征值对总方差的贡献百分比:

λj / Σλi × 100%

📈 累积方差解释

前 p 个主成分的总方差解释:

(Σλ1...p) / (Σλ1...D) × 100%

📖 术语解释

"Total Variance Explained" 指的是原始数据中所有变量的总方差被 PCA 模型中所选的主成分所解释的比例。这个值通常以百分比的形式给出,可以帮助我们了解每个主成分对数据的解释程度,以及所有主成分的总体效果。

💡 主成分分析中,我们常用陡坡图 (scree plot) 和累积方差曲线可视化这个百分比。

🔄 两种实现路径

📐方法一:特征值分解

1. Σ = X_c^T X_c / (n-1)
2. Σ = VΛV^T
3. Z = X_c V_p

✓ 适用于协方差矩阵
✓ 直接获得特征值和特征向量

🎯方法二:奇异值分解

1. X_c = UΣV^T (SVD)
2. V 即为主成分方向
3. Z = X_c V_p

✓ 直接分解数据矩阵
✓ 数值稳定性更好

💡 两种方法本质等价,都能得到相同的主成分方向和降维结果

🎯 本节要点

核心概念

  • ✓ PCA是无监督学习的降维方法
  • ✓ 通过线性变换保留最大方差
  • ✓ 主成分互相正交
  • ✓ 特征值代表方差贡献

实践要点

  • ✓ 数据预处理(标准化/中心化)
  • ✓ 选择合适的主成分数量
  • ✓ 用陡坡图辅助决策
  • ✓ 关注累积方差解释率
25.2

原始数据

Original Data Matrix

《矩阵力量》介绍过,样本数据矩阵 X 可以分别通过行和列来解释。

📊 按列理解

矩阵 X 每一列代表一个特征向量:

X = [x₁, x₂, x₃, x₄]

每个特征向量包含所有样本在该特征上的取值

📋 按行理解

矩阵 X 每一行代表一个样本:

x⁽¹⁾ = [x₁,₁, x₁,₂, x₁,₃, x₁,₄]

每个样本是一个D维向量

数据矩阵可视化

下图展示原始数据矩阵 X 的热图。红色色系代表正数,蓝色色系代表负数,黄色接近0。本例中假设 X 已经中心化,即 E(X) = 0ᵀ,质心位于原点。

特征分布特点

下图所示为矩阵 X 每一列特征数据的分布情况。可以发现原始特征之间的标准差区别不大。但是经过主成分分解之后,可以明显发现每一列新特征数据标准差大小差异显著。

25.3

特征值分解协方差矩阵

Eigenvalue Decomposition of Covariance Matrix

本书第13章介绍过,X 的协方差矩阵 Σ 可以通过下式计算得到:

📐 协方差矩阵计算公式

Σ = (X_cT X_c) / (n - 1)
其中 X_c = X - E(X)

其中,E(X) 也常被称作原始数据 X 的质心;X - E(X) 相当于数据中心化。当 n 足够大,分母可以用 n 替换。本例设定 E(X) = 0ᵀ,即 X = X_c。

谱分解

Σ 为实数对称矩阵,它的特征值分解(谱分解)可以写作:

Σ = VΛVT

矩阵 V

  • • 正交矩阵
  • • VTV = I
  • • 列向量为特征向量
  • • 也称为载荷矩阵

矩阵 Λ

  • • 对角矩阵
  • • 主对角线为特征值
  • • λ₁ ≥ λ₂ ≥ ... ≥ λ_D
  • • 从大到小排列

主成分与载荷

🔑 关键概念

V 为特征向量构造的 D×D 方阵:

V = [v₁, v₂, ..., v_D] = [PC1, PC2, ..., PC_D]
每一列是一个主成分(特征向量)
第一主成分 PC1

v₁,对应最大特征值λ₁,解释最多方差

第二主成分 PC2

v₂,对应次大特征值λ₂,与PC1正交

💡 V 的列向量也叫载荷 (loadings)。从统计学角度来讲,λj 是第 j 个主成分所贡献的方差。

迹与总方差

协方差矩阵 Σ 的迹 trace(Σ) 等于特征值方阵 Λ 的迹:

trace(Σ) = σ₁² + σ₂² + ... + σ_D² = λ₁ + λ₂ + ... + λ_D = trace(Λ)

这个等式说明,原始数据的总方差等于所有特征值之和。

协方差矩阵的几何意义

🎨 3D可视化:协方差椭球

协方差矩阵可以用一个椭球来表示其几何意义。椭球的三个主轴方向对应特征向量,轴的长度对应特征值的平方根。

第一主轴 (PC1)

最长轴,沿着v₁方向,长度 ∝ √λ₁

第二主轴 (PC2)

中等长度,沿着v₂方向,与v₁正交

第三主轴 (PC3)

最短轴,沿着v₃方向,与v₁、v₂正交

💡 几何直观理解

协方差椭球

  • • 描述数据的分布形状
  • • 椭球内包含约95%的数据点
  • • 椭球拉伸方向 = 数据变化最大方向
  • • 椭球压缩方向 = 数据变化最小方向

主成分方向

  • • PC1指向最大方差方向
  • • PC2与PC1垂直,指向次大方差方向
  • • PC3与PC1、PC2都垂直
  • • 三个主成分构成新的坐标系

🔍 观察不同数据模式

相关数据

椭球倾斜,特征向量不沿坐标轴。这表示原始特征间存在相关性。

对角数据

椭球沿坐标轴,但轴长不等。特征间独立,但方差不同。

球形数据

椭球变为球体,各方向方差相等。数据呈各向同性分布。

25.4

投影

Projection Perspective

本节从投影角度介绍PCA。数据矩阵 X 投影到矩阵 V 正交系 (v₁, v₂, ..., v_D) 得到新特征数据矩阵 Z,即:

📐 核心投影公式

Z = XV
V: 载荷 (loadings)
D×D 特征向量矩阵
Z: 得分 (scores)
n×D 变换后数据

💡 《矩阵力量》第10章特别介绍过这种数据投影,建议大家回顾。

3D投影过程演示

🎬 交互式投影演示

下面的3D可视化展示了数据点如何投影到主成分方向。紫色点代表原始数据,彩色点代表投影结果,虚线显示投影方向。

→ PC1

投影到第一主成分,得到z₁

→ PC2

投影到第二主成分,得到z₂

→ PC1-PC2平面

降维到2D,3D→2D

原始数据

查看所有主成分方向

线性组合视角

以列向量 v₁ 为例,它的每个元素相当于 [x₁, x₂, …, x_D] 线性组合的对应系数。将 X 向 v₁ 投影:

z₁ = Xv₁
展开后:
z₁ = v₁,₁·x₁ + v₂,₁·x₂ + ... + v_D,₁·x_D

简单来讲,z₁ 相当于 [x₁, x₂, …, x_D] 的某种特殊线性组合。

单个主成分投影

z₁ = Xv₁

• 结果是 n×1 向量(一维数据)

• 每个样本投影到PC1上的坐标

• 保留最大方差方向的信息

多主成分投影

[z₁, z₂] = X[v₁, v₂]

• 结果是 n×2 矩阵(二维数据)

• 实现 D维 → 2维 降维

• 保留前两个主成分的信息

💡 变换后数据的特性

前文讨论过,矩阵 X 每一列特征数据方差区别不大;而经过PCA分解得到的矩阵 Z 四个新特征数据分布差异显著。

z₁ (第一列)

数据分布最为分散,第一主成分解释了数据中最多方差

z₂ → z_D

从第一列到第D列,数据分散情况逐渐降低,方差依次减小

🔢 Z的协方差矩阵

前文假设 X 已经中心化,因此 z₁ 的期望值为 0。对 z₁ 求方差:

var(z₁) = v₁ᵀ Σ v₁ = λ₁

类似地,var(z₂) = λ₂, ..., var(z_D) = λ_D

Z 的协方差矩阵:

var(Z) = VᵀΣV = VᵀVΛVᵀV = Λ

💡 变换后的数据协方差矩阵是对角矩阵,特征间不相关!

🔄 关键区别

值得强调的一点是,把原始数据 X 或中心化数据 X_c 投影到 V 中结果不一样。从统计角度来看,差异主要体现在质心位置,而投影得到的数据协方差矩阵相同。

使用原始数据X

  • • 质心位置:E(Z) = E(XV) = E(X)V ≠ 0
  • • 协方差矩阵:var(Z) = Λ
  • • 适用于需要保留均值的情况

使用中心化数据X_c

  • • 质心位置:E(Z) = E(X_c)V = 0
  • • 协方差矩阵:var(Z) = Λ
  • • 标准做法,更便于分析
25.5

几何视角看PCA

Geometric Perspective of PCA

从几何角度来看,PCA与协方差椭圆有着密切的关系。椭圆的形状和方向直观地反映了数据的分布特征。

协方差椭圆与主成分的关系

⭕ 椭圆的几何意义

如下图所示,椭圆中心对应质心 μ,椭圆与±σ标准差构成的矩形相切,四个切点分别为A、B、C和D。

EF(长轴)

相当于PCA的第一主成分,指向方差最大方向

GH(短轴)

相当于PCA的第二主成分,与长轴正交

对角线AC

在给定x₂条件下,x₁的条件概率期望值

对角线BD

在给定x₁条件下,x₂的条件概率期望值

几何视角下的PCA流程

假设原始数据已经标准化,计算得到协方差矩阵 Σ,找到 Σ 对应椭圆的半长轴所在方向 v₁。v₁ 对应的便是第一主成分PC1。原始数据朝 v₁ 投影得到的数据对应最大方差。

🔄 几何变换流程

📊
1. 原始数据

收集样本,形成数据矩阵X

📈
2. 计算协方差

Σ = XTX/(n-1),得到协方差矩阵

🔬
3. 特征分解

Σ = VΛVT,找到特征向量[v₁, v₂]

🔄
4. 旋转坐标系

将坐标系旋转到主成分方向

🎯
5. 投影降维

Z = XV,投影到主成分空间

💡 整个过程实际上用到了《矩阵力量》中介绍的平移、缩放、正交化、投影、旋转等数学工具。

两个角度看数据

从线性变换角度来看,主成分分析无非就是在不同的坐标系中看同一组数据。数据朝不同方向投影会得到不同的投影结果,对应不同的分布:

📐 沿长轴方向投影

  • • 得到的数据标准差最大
  • • 保留最多信息
  • • 对应第一主成分PC1
  • • 数据分布最分散

📐 沿短轴方向投影

  • • 得到的数据标准差最小
  • • 信息冗余,可以舍弃
  • • 对应第二主成分PC2
  • • 数据分布最集中

📖 实例解析

原始二维数据 X

数据的质心位于 [1, 2]T。两个特征上分布分散情况相似,也就是方差大小几乎相同。

💡 在原始坐标系中,难以判断数据的主要变化方向

使用sklearn.decomposition.PCA()

pca.components_获得主成分向量 [v₁, v₂]
pca.transform(X)获得投影后的数据Y = XV

变换后的结果

在新坐标系[v₁, v₂]中,数据Y的两列分布差异显著:

  • • 第一列(沿v₁):分布分散,标准差大
  • • 第二列(沿v₂):分布集中,标准差小
25.6

奇异值分解

Singular Value Decomposition (SVD)

奇异值分解(SVD)也可以用来做主成分分析。《矩阵力量》系统讲解过奇异值分解的四种类型:

📘 完全型 (Full)

U为方阵,S矩阵并非方阵

📗 经济型 (Economy-size)

去掉完全型中的零矩阵

📕 紧凑型 (Compact)

适用于非满秩矩阵

📙 截断型 (Truncated)

仅保留前p个主成分

四种SVD类型对比

🔬 交互式SVD类型演示

下面的可视化展示了四种SVD分解的矩阵形状差异。调整参数观察不同类型的特点。

完全型

U为n×n方阵

经济型

最常用,numpy默认

紧凑型

rank(X)=r<D

截断型

PCA降维核心

矩阵的秩与机器学习

📚 矩阵秩的概念

在线性代数中,矩阵的秩指的是其列向量或行向量的线性无关的数量。

满秩矩阵

秩等于行数或列数的较小值

非满秩矩阵

秩小于行数或列数的较小值

💡 在机器学习中,非满秩矩阵通常表示存在冗余或线性相关的特征或样本。这些冗余可能会导致算法的过拟合,降低模型的准确性和稳定性。因此需要进行降维或正则化处理。

SVD完成主成分分析

截断型SVD是PCA的核心。注意使用约等号"≈",因为截断型SVD仅还原X矩阵部分数据,并非还原全部信息。

🔄 SVD-PCA流程

步骤1:中心化数据

对数据矩阵X进行中心化(去均值)处理

步骤2:SVD分解

对中心化的X进行完全型或经济型SVD分解:

X = USVᵀ
步骤3:计算协方差矩阵
Σ = XᵀX / (n-1)

由于 V 和 U 都是正交矩阵(UᵀU = I, VᵀV = I),代入SVD分解式可得:

Σ = V(S²/(n-1))Vᵀ

💻 Python实现

Python中常用的奇异值分解函数为 numpy.linalg.svd()

使用NumPy SVD

# 中心化数据
X_centered = X - X.mean(axis=0)

# SVD分解
U, S, Vt = np.linalg.svd(X_centered, 
                         full_matrices=False)

# V是主成分方向
V = Vt.T

# 计算特征值
eigenvalues = (S**2) / (n - 1)

# 投影到主成分空间
Z = X_centered @ V

使用sklearn PCA

from sklearn.decomposition import PCA

# 创建PCA对象
pca = PCA(n_components=2)

# 拟合并转换
Z = pca.fit_transform(X)

# 获取主成分方向
V = pca.components_.T

# 获取特征值
eigenvalues = pca.explained_variance_

# sklearn内部使用SVD!

💡 关键洞察:sklearn的PCA内部实现使用的是SVD分解,而不是协方差矩阵的特征值分解。这是因为SVD在数值稳定性和计算效率上都更优秀。