PCA,全称 Principal Component Analysis,主成分分析,其核心思想为:把原来很多维的特征,重新组合成少数几个“最重要的新特征”,用这些新特征尽量保留原始数据的信息。
一、原理与基本步骤
PCA 的目标是:**找到一个方向,使数据投影到这个方向后的方差最大。**PCA 的完整过程一般包括以下几步:
1、数据中心化
首先需要对数据进行中心化处理,假设原始数据矩阵为:
$$
X =
\begin{bmatrix}
x_{11} & x_{12} & \cdots & x_{1d}
x_{21} & x_{22} & \cdots & x_{2d}
\vdots & \vdots & \ddots & \vdots
x_{n1} & x_{n2} & \cdots & x_{nd}
\end{bmatrix}
$$
其中 $n$ 表示样本数量,$d$ 表示特征数量。第 $j$ 个特征的均值为:
$$
\bar{x}j = \frac{1}{n}\sum{i=1}^{n} x_{ij}
$$
对每个特征减去对应均值,得到中心化后的数据:
$$
x’{ij} = x{ij} - \bar{x}_j
$$
写成矩阵形式就是:
$$
X_{\text{centered}} = X - \bar{X}
$$
中心化之后,每一列特征的均值都变成 0。PCA 关注的是数据的变化方向,而不是数据整体的位置,所以中心化是 PCA 中非常重要的一步。
2、计算协方差矩阵
中心化之后,需要计算协方差矩阵。协方差矩阵可以写成:
$$
C = \frac{1}{n-1}X_{\text{centered}}^T X_{\text{centered}}
$$
其中:
$$
C \in \mathbb{R}^{d \times d}
$$
协方差矩阵中的每个元素表示两个特征之间的协方差。第 $j$ 个特征和第 $k$ 个特征之间的协方差为:
$$
\frac{1}{n-1}
\sum_{i=1}^{n}
(x_{ij} - \bar{x}j)(x{ik} - \bar{x}_k)
$$
如果两个特征经常一起变大或一起变小,那么协方差为正。如果一个特征变大时另一个特征变小,那么协方差为负。如果两个特征之间没有明显关系,那么协方差接近 0。
3、求特征值和特征向量
接下来,对协方差矩阵进行特征值分解:
$$
Cv = \lambda v
$$
其中:$v$是特征向量,$\lambda$是特征值。
在 PCA 中:
$$
\text{特征向量} = \text{主成分方向}
$$
$$
\text{特征值} = \text{该方向上的方差大小}
$$
特征值越大,说明数据在对应方向上的变化越大,也说明这个方向保留的信息越多。
4、按特征值从大到小排序
假设求出的特征值为:
$$
\lambda_1, \lambda_2, \lambda_3, \cdots, \lambda_d
$$
将它们按照从大到小排列:
$$
\lambda_1 \geq \lambda_2 \geq \lambda_3 \geq \cdots \geq \lambda_d
$$
对应的特征向量为:
$$
v_1, v_2, v_3, \cdots, v_d
$$
其中:$v_1$表示第一主成分方向,$v_2$表示第二主成分方向,$v_3$表示第三主成分方向。
5、选择前 $k$ 个主成分
如果原始数据有 $d$ 个特征,那么最多可以得到 $d$ 个主成分。降维时,只需要选择前 $k$ 个主成分:
$$
v_1, v_2, \cdots, v_k
$$
把它们组成投影矩阵:
$$
W =
\begin{bmatrix}
v_1 & v_2 & \cdots & v_k
\end{bmatrix}
$$
其中:
$$
W \in \mathbb{R}^{d \times k}
$$
6、投影到低维空间
将中心化后的数据投影到前 $k$ 个主成分构成的空间中:
$$
Z = X_{\text{centered}} W
$$
其中:
$$
Z \in \mathbb{R}^{n \times k}
$$
$Z$ 就是降维后的数据。原始数据维度为:
$$
X \in \mathbb{R}^{n \times d}
$$
降维后的数据维度为:
$$
Z \in \mathbb{R}^{n \times k}
$$
其中:
$$
k < d
$$
这就实现了从 $d$ 维到 $k$ 维的降维。
二、PCA 中的方差贡献率
在 PCA 中,特征值可以表示每个主成分保留的信息量。假设所有特征值为:
$$
\lambda_1, \lambda_2, \lambda_3, \cdots, \lambda_d
$$
第 $i$ 个主成分的方差贡献率为:
$$
r_i =
\frac{\lambda_i}
{\sum_{j=1}^{d} \lambda_j}
$$
前 $k$ 个主成分的累计方差贡献率为:
$$
R_k =
\frac{\sum_{i=1}^{k} \lambda_i}
{\sum_{j=1}^{d} \lambda_j}
$$
累计方差贡献率可以用来判断应该保留多少个主成分。例如,如果:
$$
R_k \geq 0.95
$$
说明前 $k$ 个主成分已经保留了原始数据中约 95% 的信息。这时就可以考虑将数据降到 $k$ 维。
三、PCA 的优点与局限性
PCA 有几个明显优点。
第一,可以降低数据维度。当特征数量很多时,PCA 可以减少特征数量,从而降低计算量。
第二,可以去除部分冗余信息。如果原始特征之间存在相关性,PCA 可以把重复信息压缩到较少的主成分中。
第三,可以用于数据可视化。如果将高维数据降到二维或三维,就可以画图观察数据分布。
第四,可以起到一定的去噪作用。一般来说,较小方差方向中可能包含更多噪声,舍弃这些方向可以减少噪声影响。
PCA 也有一些局限。
第一,PCA 只能处理线性结构PCA 本质上是一种线性降维方法。它找到的是线性方向,也就是直线方向或超平面方向。如果数据本身是复杂的非线性结构,PCA 的效果可能不好。例如数据分布在一个弯曲的流形上,PCA 很难用简单的线性投影完整表达这种结构。
第二,PCA 对特征尺度敏感如果不同特征的数值范围差异很大,PCA 可能会被数值范围较大的特征主导。例如:
身高:150 ~ 190
收入:3000 ~ 50000
收入的数值范围远大于身高。如果不进行标准化,PCA 可能会更加关注收入这个特征,而忽略其他特征。所以在使用 PCA 前,通常需要进行标准化处理:均值变为 0,方差变为 1
第三,主成分不容易解释PCA 生成的新特征是原始特征的线性组合。原始特征可能有明确含义,例如:身高、体重、年龄、收入但是经过 PCA 后变成:PC1、PC2、PC3这些主成分的实际含义可能不够直观。因此,PCA 在提升数据处理效率的同时,可能会降低特征的可解释性。
总结
PCA 的整体流程可以总结为:
原始数据
↓
数据中心化 / 标准化
↓
计算协方差矩阵
↓
求特征值和特征向量
↓
按特征值从大到小排序
↓
选择前 k 个主成分
↓
将数据投影到低维空间
↓
得到降维后的数据
其中最关键的是:特征向量决定主成分方向,特征值决定主成分重要性
PCA 的计算流程可以总结为:
$$
X
\rightarrow
X_{\text{centered}}
\rightarrow
C
\rightarrow
(\lambda_i, v_i)
\rightarrow
W
\rightarrow
Z
$$
对应含义为:
$$
X_{\text{centered}} = X - \bar{X}
$$
$$
C = \frac{1}{n-1}X_{\text{centered}}^T X_{\text{centered}}
$$
$$
Cv_i = \lambda_i v_i
$$
$$
W =
\begin{bmatrix}
v_1 & v_2 & \cdots & v_k
\end{bmatrix}
$$
$$
Z = X_{\text{centered}}W
$$
其中最关键的是:$\lambda_i$ 决定第 $i$ 个主成分的重要性,$v_i$ 决定第 $i$ 个主成分的方向。