Lecture 16: Principal Components Analysis (PCA)
第四部分:无监督学习进阶与降维
Lecture 16: Principal Components Analysis (PCA)
概述
本讲回到无监督学习,解决降维问题:高维数据冗余多、可视化难、计算慢。主成分分析 (PCA) 找到数据方差最大的若干正交方向(主成分),把数据投影到低维子空间,同时尽可能保留数据的变化信息。本讲还简述其姊妹方法 ICA(独立成分分析,解决“鸡尾酒会问题”)。PCA 是数据预处理、可视化、去噪的标配工具。
核心概念与数学直觉
- 问题定义:数据 $\{x^{(i)}\}_{i=1}^{m}$,$x^{(i)} \in \mathbb{R}^d$,希望投影到 $k$ 维($k \ll d$)子空间,使投影后的数据方差最大(信息损失最小)。
- 直观解释:数据点云像一个“扁椭球”——PCA 找到椭球的主轴(方差最大的方向)。降维 = 沿主轴切开投影,丢掉方差最小的方向(视为噪声/冗余)。
- 例子:汽车数据中“最高时速(mph)”与“最高时速(km/h)”几乎线性相关——PCA 自动发现主轴方向,把两个冗余特征合成一个。
- 算法步骤(数据预处理 → 协方差 → 特征分解):
- 标准化:$\tilde{x}^{(i)} = x^{(i)} - \frac{1}{m}\sum_j x^{(j)}$(去均值;可选除以标准差归一化量纲)。
- 协方差矩阵:
$\Sigma = \frac{1}{m} \sum_{i=1}^{m} \tilde{x}^{(i)} \tilde{x}^{(i)T} = \frac{1}{m} X^T X$($X$ 为去均值后的 $m \times d$ 矩阵)。- $\Sigma$ 是对称半正定矩阵——其特征向量正交、特征值非负。
- 特征分解:求 $\Sigma$ 的特征向量(按特征值降序 $u_1, \dots, u_d$)。
- 特征值 $\lambda_j$ = 数据沿特征向量 $u_j$ 方向的方差。
- 投影:取前 $k$ 个特征向量组成 $U_k = [u_1 \dots u_k] \in \mathbb{R}^{d \times k}$,新表示:
$z^{(i)} = U_k^T \tilde{x}^{(i)} \in \mathbb{R}^{k}$(把 $d$ 维投影到 $k$ 维)。- 重构:$\hat{x}^{(i)} = U_k z^{(i)} + \bar{x}$——PCA 是最小化重构误差($\sum_i \vert x^{(i)} - \hat{x}^{(i)}\vert ^2$)的线性投影,与“最大方差”是同一枚硬币的两面。
- 解释方差比例:前 $k$ 个主成分保留的信息量 = $\frac{\sum_{j=1}^k \lambda_j}{\sum_{j=1}^d \lambda_j}$——常用于选 $k$(如保留 95% 方差)。
- PCA 与相关方法的联系:
- 与 SVD 的关系:$X = U \Sigma V^T$,$X^TX$ 的特征向量 = $V$ 的列——SVD 数值上更稳定,是 PCA 的标准实现(
np.linalg.svd)。 - 与因子分析 (Factor Analysis, notes9) 的区别:因子分析是概率模型($x = \Lambda z + \mu + \epsilon$,用 EM 估计);PCA 是直接代数方法(特征分解)。因子分析假设显式噪声结构,PCA 假设“丢弃方向是噪声”。
- ICA (独立成分分析):$x = As$,$s$ 的分量统计独立(非高斯)。目标找 $W = A^{-1}$ 使 $Wx$ 分量独立。与 PCA(去相关,二阶矩)不同,ICA 利用高阶矩/非高斯性(如最大化峰度或负熵)。典型应用:鸡尾酒会问题(多麦克风分离多说话人)。
- 与 SVD 的关系:$X = U \Sigma V^T$,$X^TX$ 的特征向量 = $V$ 的列——SVD 数值上更稳定,是 PCA 的标准实现(
- PCA 的用途与陷阱:
- 可视化(降到 2/3 维)、去相关(利于后续线性模型)、去噪、压缩、加速训练。
- 陷阱:PCA 是无监督的——它不在乎标签;用 PCA 降维后分类可能变差(丢掉的维度可能含判别信息)。不应盲目用 PCA 防止过拟合(正则化/更多数据通常更有效)。
算法伪代码与逻辑解说:PCA
伪代码
输入:
- 数据矩阵 X (m×d),目标维度 k(或保留方差比例 p)
输出:
- 投影矩阵 U_k (d×k),均值 mu,降维后的数据 Z (m×k)
1. 去均值: mu = (1/m) * Σ_i x^(i); X_c = X - mu
(可选)按特征标准差归一化: X_c /= std(X_c)
2. 协方差: Sigma = (1/m) * X_c^T @ X_c // d×d
3. 特征分解: [U, S, V] = svd(Sigma) 或 eig(Sigma)
// 特征向量按特征值(=方差)降序排列
4. 选 k:
- 若给定 k: U_k = U[:, :k]
- 若给定保留比例 p: 取最小 k 使 Σ_{j=1..k} S_j / Σ_j S_j >= p
5. 投影: Z = X_c @ U_k // m×k
6. 返回 U_k, mu, Z
【算法逻辑解说】
- Step 1 标准化:PCA 对量纲敏感——身高(cm)与体重(kg)混合时,方差大的特征主导主轴。先减去均值(协方差的中心化);若要各特征等权,再除以标准差(用相关矩阵替代协方差矩阵)。
- Step 2 协方差:$\Sigma_{jl} = \frac{1}{m}\sum_i \tilde{x}_j^{(i)} \tilde{x}_l^{(i)}$——度量特征 $j$ 与 $l$ 的共变程度。PCA 的本质是“对角化这个共变矩阵”。
- Step 3 特征分解:特征向量 $u_j$ 是数据的主轴方向;特征值 $\lambda_j$ 是沿该轴的方差。用 SVD 数值更稳(避免显式构造 $X^TX$ 的平方放大)。
- Step 4 选 k:保留方差比例是客观准则(如 95%);或按下游任务(可视化用 2/3)选择。
- Step 5 投影:$Z = X_c U_k$——每行是样本在前 $k$ 个主成分上的坐标(线性组合系数)。
- 复杂度:SVD 约 $O(\min(md^2, m^2 d))$——特征多时先考虑随机化 SVD 或增量 PCA。
关键要点
- PCA = 找数据方差最大的正交方向(主轴),投影到低维子空间,最大化保留信息。
- 数学核心:协方差矩阵的特征分解;特征值 = 各方向方差。
- “最大方差”与“最小重构误差”等价——PCA 是最优的线性降维(对给定 $k$)。
- PCA 是无监督、线性、二阶统计(去相关);ICA 是线性但利用高阶统计(独立性)。
- 用途:可视化、去噪、压缩、加速;不要把 PCA 当万能防过拟合工具。
常见误区与注意事项
- 忘记标准化:不同量纲特征直接算协方差 → 大数值特征霸占主轴。先标准化(尤其特征单位不同时)。
- 把 PCA 当特征选择:PCA 生成的是线性组合(所有原始特征的加权和),不是选子集——可解释性更差。
- 认为 PCA 总能提升分类:PCA 不考虑标签,可能丢弃判别信息;分类前应比较“原始特征 vs PCA 特征”。
- 选 k 只看经验:用“保留 95% 方差”客观准则或下游任务验证,而非拍脑袋。
- 对异常值敏感:PCA 基于二阶矩,对离群点极敏感——先清洗/鲁棒化(如中位数中心化)。
- 混淆 PCA 与 ICA 目标:PCA 最大化方差(去相关,二阶矩);ICA 最大化独立性(非高斯性,高阶矩)——鸡尾酒会问题必须用 ICA 类方法。
思考题
- 问题:证明“最大化投影方差”与“最小化重构误差”对 PCA 是等价的。
- 答案:设投影方向 $u$(单位向量),样本 $\tilde{x}$ 投影 $z = u^T\tilde{x}$,重构 $\hat{x} = zu$。重构误差 $\vert \tilde{x} - \hat{x}\vert ^2 = \vert \tilde{x}\vert ^2 - (u^T\tilde{x})^2$。对所有样本求和:$\sum_i \vert \tilde{x}^{(i)}\vert ^2$ 是常数,故最小化重构误差 ⟺ 最大化 $\sum_i (u^T\tilde{x}^{(i)})^2 = u^T(\sum_i \tilde{x}^{(i)}\tilde{x}^{(i)T})u = m \cdot u^T\Sigma u$——即最大化沿 $u$ 的方差。约束 $\vert u\vert =1$ 下,解为 $\Sigma$ 最大特征值对应特征向量。
- 问题:数据是 3 维且三个特征完全线性相关(秩 1),PCA 的 $k=1$ 能保留多少方差?为什么?
- 答案:100%。协方差矩阵秩 1 ⇒ 只有一个非零特征值——数据全部落在一条直线上(一维子空间)。PCA 的 $k=1$ 主成分完全重构数据(零重构误差)。这正是“冗余特征可被自动消除”的极端例证。
- 问题:为什么 ICA 无法用协方差(二阶矩)解决?PCA 预白化对 ICA 有何帮助?
- 答案:若 $s$ 各分量独立,则 $x = As$ 的协方差 $\Sigma_x = A\Sigma_s A^T$——任意正交旋转 $A$ 都给出相同的去相关结果,二阶矩无法区分旋转。ICA 需高阶统计(非高斯性)确定唯一解。PCA 白化($\Sigma_x^{-1/2}$)先把数据去相关、归一化,将问题化简为“在正交变换中找独立性”——是标准 ICA 预处理步骤。
