主成分分析(PCA)算法:方差最大化与特征向量求解的降维过程
1. 题目描述
主成分分析(Principal Component Analysis, PCA)是一种经典的无监督降维和特征提取算法。它的核心目标是将高维数据投影到低维空间(主成分子空间),使得投影后的数据方差最大化,从而保留数据中的主要变化信息。这个过程通过计算数据的协方差矩阵及其特征值与特征向量来实现。我将详细讲解PCA的数学原理、协方差矩阵的计算、特征分解,以及降维的完整步骤。
2. 解题过程
步骤1:问题形式化与目标设定
假设我们有 \(n\) 个数据样本,每个样本是 \(d\) 维向量,组成数据矩阵 \(X \in \mathbb{R}^{n \times d}\)(通常每行是一个样本,每列是一个特征)。PCA的目标是找到一个正交投影矩阵 \(W \in \mathbb{R}^{d \times k}\)(其中 \(k < d\),且 \(W^T W = I\)),将原始数据 \(X\) 投影到低维空间 \(Z = X W \in \mathbb{R}^{n \times k}\),使得投影后数据的方差最大化。这里,\(W\) 的列向量就是主成分方向。
步骤2:数据预处理(中心化)
在进行PCA之前,必须对数据进行中心化处理,即减去每个特征的均值,以确保第一主成分描述的是数据的最大方差方向,而不是数据均值的位置。中心化过程如下:
计算每个特征的均值:\(\mu_j = \frac{1}{n} \sum_{i=1}^n X_{ij}\),其中 \(j = 1, \dots, d\)。
然后,对每个样本的每个特征减去对应均值,得到中心化数据矩阵 \(\tilde{X}\):
\[\tilde{X}_{ij} = X_{ij} - \mu_j \]
之后的所有计算都基于 \(\tilde{X}\)(为简化符号,下文仍用 \(X\) 表示中心化后的数据)。
步骤3:方差最大化与协方差矩阵
我们希望最大化投影后数据的方差。投影到某个单位方向向量 \(w\)(即 \(||w||_2 = 1\))后的数据为 \(z = X w \in \mathbb{R}^n\)。其样本方差为:
\[\frac{1}{n} \sum_{i=1}^n z_i^2 = \frac{1}{n} z^T z = \frac{1}{n} w^T X^T X w \]
由于 \(n\) 是常数,最大化方差等价于最大化 \(w^T (X^T X) w\)。
这里,\(X^T X \in \mathbb{R}^{d \times d}\) 是(非中心化的)协方差矩阵的 \(n\) 倍。通常,我们使用样本协方差矩阵:
\[\Sigma = \frac{1}{n-1} X^T X \]
在最大化方差时,常数因子不影响优化,因此我们直接针对 \(X^T X\) 求解。
步骤4:特征值分解求解主成分
因此,PCA的优化问题为:
\[\max_{w} \; w^T (X^T X) w \quad \text{s.t.} \quad w^T w = 1 \]
这是一个带有等式约束的优化问题,可以通过拉格朗日乘子法求解。构造拉格朗日函数:
\[\mathcal{L}(w, \lambda) = w^T (X^T X) w - \lambda (w^T w - 1) \]
对 \(w\) 求梯度并令为零:
\[\frac{\partial \mathcal{L}}{\partial w} = 2 X^T X w - 2 \lambda w = 0 \]
这得到:
\[X^T X w = \lambda w \]
这正是矩阵 \(X^T X\) 的特征值方程。因此,最优的投影方向 \(w\) 是 \(X^T X\) 的特征向量,对应的特征值 \(\lambda\) 就是投影后数据的方差(乘以某个常数)。为了使方差最大化,我们应该选择最大特征值对应的特征向量作为第一主成分。
步骤5:计算所有主成分与降维
矩阵 \(X^T X\) 是对称半正定矩阵,可以进行特征值分解:
\[X^T X = W \Lambda W^T \]
其中,\(W = [w_1, w_2, \dots, w_d]\) 是正交矩阵,列向量 \(w_j\) 是特征向量(主成分方向);\(\Lambda = \text{diag}(\lambda_1, \lambda_2, \dots, \lambda_d)\) 是对角矩阵,特征值满足 \(\lambda_1 \ge \lambda_2 \ge \dots \ge \lambda_d \ge 0\)。
为了降到 \(k\) 维,我们只需取前 \(k\) 个最大特征值对应的特征向量组成投影矩阵 \(W_k = [w_1, w_2, \dots, w_k]\)。然后,降维后的数据为:
\[Z = X W_k \]
这里,\(Z\) 的每一行是一个样本的 \(k\) 维表示。
步骤6:计算步骤总结
- 输入:数据矩阵 \(X \in \mathbb{R}^{n \times d}\),目标维度 \(k\)(\(k \le d\))。
- 中心化:对每个特征列,减去其均值,得到中心化矩阵 \(X_c\)。
- 计算协方差矩阵:\(C = \frac{1}{n-1} X_c^T X_c\)(或用 \(X_c^T X_c\) 代替,不影响特征向量)。
- 特征值分解:对 \(C\) 进行特征值分解,得到特征值 \(\lambda_1 \ge \lambda_2 \ge \dots \ge \lambda_d\) 和对应的特征向量 \(w_1, w_2, \dots, w_d\)。
- 选择主成分:取前 \(k\) 个特征向量组成 \(W_k = [w_1, w_2, \dots, w_k]\)。
- 投影:计算降维数据 \(Z = X_c W_k\)。
- 输出:降维后的数据 \(Z \in \mathbb{R}^{n \times k}\) 和投影矩阵 \(W_k\)。
3. 补充说明
- 方差解释率:每个主成分的方差解释率为 \(\lambda_i / \sum_{j=1}^d \lambda_j\),可用于选择 \(k\)(例如累计解释率 > 95%)。
- 与SVD的关系:PCA也可以通过奇异值分解(SVD)计算。对中心化数据 \(X\) 进行SVD:\(X = U S V^T\),其中 \(V\) 的列就是 \(X^T X\) 的特征向量,即主成分方向,且 \(S^2/(n-1)\) 是特征值。因此,\(Z = U_k S_k\) 或 \(Z = X V_k\) 是降维数据。
- 应用:PCA常用于数据可视化、噪声过滤、特征提取及加速后续机器学习算法。