"掌握我们的命运的不是星象,而是我们自己。"
— 威廉·莎士比亚 (William Shakespeare) | 英国剧作家 | 1564 ~ 1616
🐍 Python工具箱
再聊主成分分析
Principal Component Analysis Revisited
主成分分析 (Principal Component Analysis, PCA) 是重要的降维工具。PCA 可以显著减少数据的维数,同时保留数据中对方差贡献最大的成分。
💡 核心思想
通过线性变换将高维数据映射到低维空间中,使得映射后的数据能够尽可能地保留原始数据的信息,同时去除噪声和冗余信息,从而更好地描述数据的本质特征。
🎯 应用场景
- • 降维:减少数据维度
- • 可视化:多维数据投影到2D/3D
- • 特征提取:提取主要特征
- • 去噪:过滤冗余信息
📚 相关主题
- • 协方差矩阵
- • 特征值分解
- • 奇异值分解 (SVD)
- • 主成分回归 (PCR)
无监督学习
主成分分析是重要的无监督学习 (unsupervised learning) 算法。无监督学习是一种机器学习方法,它处理没有标签或输出值的数据。
无监督学习的主要类型:
将相似的数据点分组到不同的簇中,将数据分割为具有内在结构的不同子集。
从高维数据中提取出具有代表性的低维特征,减少计算复杂度、提高可视化效果。PCA就是常用的降维算法。
检测数据集中的异常数据点,这些数据点与其它数据点存在显著差异。马氏距离常用来发现离群值。
在大规模数据集中寻找频繁出现的关联项集,发现数据中的相关性和关联性。
PCA一般步骤
如下图所示,PCA 的一般步骤如下:
📋 详细步骤说明
计算原始数据 Xn×D 的协方差矩阵 ΣD×D
对 Σ 特征值分解,获得特征值 λi 与特征向量矩阵 VD×D
对特征值 λi 从大到小排序,选择其中特征值最大的 p 个特征向量
将原始数据(中心化数据)投影到这 p 个正交向量构建的低维空间中,获得得分 Zn×p
⚠️ 数据预处理
在第一步之前,通常需要对数据进行预处理:
- • 标准化 (Standardization):计算 Z 分数,防止不同特征上方差差异过大
- • 中心化 (Centering):去均值,将数据质心移到原点,E(Xc) = 0
💡 标准化数据的协方差矩阵实际上就是原数据的相关性系数矩阵。
主成分方向可视化
在二维空间中,我们可以直观地看到主成分的方向。第一主成分 (PC1) 指向数据方差最大的方向,第二主成分 (PC2) 与PC1正交,指向次大方差方向。
方差贡献与主成分选择
🔑 核心概念:迹与总方差
协方差矩阵 Σ 的迹 trace(Σ) 等于特征值方阵 Λ 的迹 trace(Λ):
从统计学角度来讲,λj 是第 j 个主成分所贡献的方差。
📊 个体方差贡献
第 j 个特征值对总方差的贡献百分比:
📈 累积方差解释
前 p 个主成分的总方差解释:
📖 术语解释
"Total Variance Explained" 指的是原始数据中所有变量的总方差被 PCA 模型中所选的主成分所解释的比例。这个值通常以百分比的形式给出,可以帮助我们了解每个主成分对数据的解释程度,以及所有主成分的总体效果。
💡 主成分分析中,我们常用陡坡图 (scree plot) 和累积方差曲线可视化这个百分比。
🔄 两种实现路径
📐方法一:特征值分解
✓ 适用于协方差矩阵
✓ 直接获得特征值和特征向量
🎯方法二:奇异值分解
✓ 直接分解数据矩阵
✓ 数值稳定性更好
💡 两种方法本质等价,都能得到相同的主成分方向和降维结果
🎯 本节要点
核心概念
- ✓ PCA是无监督学习的降维方法
- ✓ 通过线性变换保留最大方差
- ✓ 主成分互相正交
- ✓ 特征值代表方差贡献
实践要点
- ✓ 数据预处理(标准化/中心化)
- ✓ 选择合适的主成分数量
- ✓ 用陡坡图辅助决策
- ✓ 关注累积方差解释率
原始数据
Original Data Matrix
《矩阵力量》介绍过,样本数据矩阵 X 可以分别通过行和列来解释。
📊 按列理解
矩阵 X 每一列代表一个特征向量:
每个特征向量包含所有样本在该特征上的取值
📋 按行理解
矩阵 X 每一行代表一个样本:
每个样本是一个D维向量
数据矩阵可视化
下图展示原始数据矩阵 X 的热图。红色色系代表正数,蓝色色系代表负数,黄色接近0。本例中假设 X 已经中心化,即 E(X) = 0ᵀ,质心位于原点。
特征分布特点
下图所示为矩阵 X 每一列特征数据的分布情况。可以发现原始特征之间的标准差区别不大。但是经过主成分分解之后,可以明显发现每一列新特征数据标准差大小差异显著。
特征值分解协方差矩阵
Eigenvalue Decomposition of Covariance Matrix
本书第13章介绍过,X 的协方差矩阵 Σ 可以通过下式计算得到:
📐 协方差矩阵计算公式
其中,E(X) 也常被称作原始数据 X 的质心;X - E(X) 相当于数据中心化。当 n 足够大,分母可以用 n 替换。本例设定 E(X) = 0ᵀ,即 X = X_c。
谱分解
Σ 为实数对称矩阵,它的特征值分解(谱分解)可以写作:
矩阵 V
- • 正交矩阵
- • VTV = I
- • 列向量为特征向量
- • 也称为载荷矩阵
矩阵 Λ
- • 对角矩阵
- • 主对角线为特征值
- • λ₁ ≥ λ₂ ≥ ... ≥ λ_D
- • 从大到小排列
主成分与载荷
🔑 关键概念
V 为特征向量构造的 D×D 方阵:
v₁,对应最大特征值λ₁,解释最多方差
v₂,对应次大特征值λ₂,与PC1正交
💡 V 的列向量也叫载荷 (loadings)。从统计学角度来讲,λj 是第 j 个主成分所贡献的方差。
迹与总方差
协方差矩阵 Σ 的迹 trace(Σ) 等于特征值方阵 Λ 的迹:
这个等式说明,原始数据的总方差等于所有特征值之和。
协方差矩阵的几何意义
🎨 3D可视化:协方差椭球
协方差矩阵可以用一个椭球来表示其几何意义。椭球的三个主轴方向对应特征向量,轴的长度对应特征值的平方根。
最长轴,沿着v₁方向,长度 ∝ √λ₁
中等长度,沿着v₂方向,与v₁正交
最短轴,沿着v₃方向,与v₁、v₂正交
💡 几何直观理解
协方差椭球
- • 描述数据的分布形状
- • 椭球内包含约95%的数据点
- • 椭球拉伸方向 = 数据变化最大方向
- • 椭球压缩方向 = 数据变化最小方向
主成分方向
- • PC1指向最大方差方向
- • PC2与PC1垂直,指向次大方差方向
- • PC3与PC1、PC2都垂直
- • 三个主成分构成新的坐标系
🔍 观察不同数据模式
椭球倾斜,特征向量不沿坐标轴。这表示原始特征间存在相关性。
椭球沿坐标轴,但轴长不等。特征间独立,但方差不同。
椭球变为球体,各方向方差相等。数据呈各向同性分布。
投影
Projection Perspective
本节从投影角度介绍PCA。数据矩阵 X 投影到矩阵 V 正交系 (v₁, v₂, ..., v_D) 得到新特征数据矩阵 Z,即:
📐 核心投影公式
💡 《矩阵力量》第10章特别介绍过这种数据投影,建议大家回顾。
3D投影过程演示
🎬 交互式投影演示
下面的3D可视化展示了数据点如何投影到主成分方向。紫色点代表原始数据,彩色点代表投影结果,虚线显示投影方向。
投影到第一主成分,得到z₁
投影到第二主成分,得到z₂
降维到2D,3D→2D
查看所有主成分方向
线性组合视角
以列向量 v₁ 为例,它的每个元素相当于 [x₁, x₂, …, x_D] 线性组合的对应系数。将 X 向 v₁ 投影:
简单来讲,z₁ 相当于 [x₁, x₂, …, x_D] 的某种特殊线性组合。
单个主成分投影
• 结果是 n×1 向量(一维数据)
• 每个样本投影到PC1上的坐标
• 保留最大方差方向的信息
多主成分投影
• 结果是 n×2 矩阵(二维数据)
• 实现 D维 → 2维 降维
• 保留前两个主成分的信息
💡 变换后数据的特性
前文讨论过,矩阵 X 每一列特征数据方差区别不大;而经过PCA分解得到的矩阵 Z 四个新特征数据分布差异显著。
z₁ (第一列)
数据分布最为分散,第一主成分解释了数据中最多方差
z₂ → z_D
从第一列到第D列,数据分散情况逐渐降低,方差依次减小
🔢 Z的协方差矩阵
前文假设 X 已经中心化,因此 z₁ 的期望值为 0。对 z₁ 求方差:
类似地,var(z₂) = λ₂, ..., var(z_D) = λ_D
Z 的协方差矩阵:
💡 变换后的数据协方差矩阵是对角矩阵,特征间不相关!
🔄 关键区别
值得强调的一点是,把原始数据 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) = Λ
- • 标准做法,更便于分析
几何视角看PCA
Geometric Perspective of PCA
从几何角度来看,PCA与协方差椭圆有着密切的关系。椭圆的形状和方向直观地反映了数据的分布特征。
协方差椭圆与主成分的关系
⭕ 椭圆的几何意义
如下图所示,椭圆中心对应质心 μ,椭圆与±σ标准差构成的矩形相切,四个切点分别为A、B、C和D。
相当于PCA的第一主成分,指向方差最大方向
相当于PCA的第二主成分,与长轴正交
在给定x₂条件下,x₁的条件概率期望值
在给定x₁条件下,x₂的条件概率期望值
几何视角下的PCA流程
假设原始数据已经标准化,计算得到协方差矩阵 Σ,找到 Σ 对应椭圆的半长轴所在方向 v₁。v₁ 对应的便是第一主成分PC1。原始数据朝 v₁ 投影得到的数据对应最大方差。
🔄 几何变换流程
收集样本,形成数据矩阵X
Σ = XTX/(n-1),得到协方差矩阵
Σ = VΛVT,找到特征向量[v₁, v₂]
将坐标系旋转到主成分方向
Z = XV,投影到主成分空间
💡 整个过程实际上用到了《矩阵力量》中介绍的平移、缩放、正交化、投影、旋转等数学工具。
两个角度看数据
从线性变换角度来看,主成分分析无非就是在不同的坐标系中看同一组数据。数据朝不同方向投影会得到不同的投影结果,对应不同的分布:
📐 沿长轴方向投影
- • 得到的数据标准差最大
- • 保留最多信息
- • 对应第一主成分PC1
- • 数据分布最分散
📐 沿短轴方向投影
- • 得到的数据标准差最小
- • 信息冗余,可以舍弃
- • 对应第二主成分PC2
- • 数据分布最集中
📖 实例解析
原始二维数据 X
数据的质心位于 [1, 2]T。两个特征上分布分散情况相似,也就是方差大小几乎相同。
使用sklearn.decomposition.PCA()
变换后的结果
在新坐标系[v₁, v₂]中,数据Y的两列分布差异显著:
- • 第一列(沿v₁):分布分散,标准差大
- • 第二列(沿v₂):分布集中,标准差小
奇异值分解
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流程
对数据矩阵X进行中心化(去均值)处理
对中心化的X进行完全型或经济型SVD分解:
由于 V 和 U 都是正交矩阵(UᵀU = I, VᵀV = I),代入SVD分解式可得:
💻 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在数值稳定性和计算效率上都更优秀。