主成分分析

主成分分析(Principal Components Analysis,简称PCA)是一种数据降维方法,在降低数据维度的同时,尽可能保留原始数据的特征。PCA的原理解释有多个版本,这篇笔记只讨论其中一个。

参考

原理

PCA最终目的是对表示 $m$ 条 $n$ 维(n个特征)数据的矩阵 $X{m \times n}$ 做线性变换,得到矩阵 $Y{m \times n}$,再从中选取 k 维:

$$ Y{m \times n} = X{m \times n} P_{n \times n} $$

怎样求解变换矩阵 $P$? 我们想要的理想效果是 $Y$ 的 $n$ 个维度相互独立,这样每个维度保留各自的特征互不干扰,然后选取 $n$ 个维度中方差最大的 k 个维度,包含最丰富的信息。

先介绍矩阵 $X$ 协方差矩阵的计算公式,这里假设已经处理 $X$ 每个维度使之均值为0:

$$ CX = \frac{1}{n}\sum{i=1}^{m}(X[:,i]^T X[:,i]) = \frac{1}{n} X^TX $$

其中 $X[:,i]$ 表示取 $X$ 的第 $i$ 列特征。这里引入 协方差 的概念,如果两个随机变量相互独立,那么它们的协方差为0。协方差矩阵的每个元素 $c_{ij}$ 等于对应 $i,j$ 维度的协方差,而对角元素等于对应维度的方差,所以我们的目标是 使 $Y$ 的协方差矩阵为对角矩阵

同样,有:

$$ C_Y = \frac{1}{n} Y^T Y = \frac{1}{n} (XP)^T(XP) = P^T (\frac{1}{n}X^TX) P \
= P^T C_X P $$

因为 $C_X$ 为实对称矩阵,故能够进行对角化:

$$ C_X = S\Lambda S^{-1} = S\Lambda S^{T}$$

其中 $\Lambda$ 为对角矩阵,其对角线元素为 $C_X$ 的特征值,而 $S$ 是正交矩阵,有 $S^TS=I$。容易想到,如果令 $P=S$:

$$ C_Y = (P^TS) \Lambda (P^TS)^T = \Lambda $$

这就成功将 $C_Y$ 变换为对角矩阵,所以顺利解得 $P=S$。

最后一步选取 $n$ 维中方差最大的 $k$ 维以达到降维的最终目的。$C_Y$ 的对角元素对应 $Y$ 每个维度的方差,所以我们只需保留 $k$ 个最大对角元对应的 $P$ 的 $k$ 个列向量,同时也是 $C_X$ 的 $k$ 个最大特征值对应的特征向量,得到 $n \times k$ 的变换矩阵 $P$,最后做线性变换 $Y=XP$。

实战

$m$ 条 $n$ 维数据由矩阵 $X_{m \times n}$ 表示。以下是处理步骤:

  1. 对 $X$ 每个维度做中心化(可进一步做标准化)
  2. 求协方差矩阵 $C_X = X^TX$
  3. 对角化: $C_X = S\Lambda S^{T}$
  4. 从 $S$ 中挑选 $k$ 列特征值($\Lambda$ 对角元)最大的特征向量得到 $P$
  5. $Y{m\times k}=X{m\times n}P_{n\times k}$

调用 sklearn API:

1
2
3
4
5
6
7
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data # 加载实验数据,有 4 维

from sklearn import decomposition
# 调用只需这一句,n_components 指定降维后的维度数 3
pX = decomposition.PCA(n_components=3).fit_transform(X)

python 实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data # 加载实验数据,有 4 维

from numpy import linalg as LA

n_components = 3 # 指定降维后的维度数 3

Xm = X - X.mean(axis=0) # 中心化
Cx = Xm.T.dot(Xm) # 协方差矩阵
ev, S = LA.eigh(Cx) # 对角化,S 特征向量按特征值升序排列
P = S[:, [i for i in range(4-n_components, 4)]] # 选取特征向量,构造变换矩阵
pX = Xm.dot(P) # 线性变换

白化

白化的目的:

  • 特征之间相关性较低
  • 所有特征具有相同的方差

前者可以用 不降维 的PCA做到。假设已经通过PCA得到变换矩阵 $P{n\times n}$,则 $Y{m \times n}=X{m \times n}P{n \times n}$。接下来需要达到后一个目标,使 $C_Y=I$。

PCA白化

由于 $CY = \frac{1}{n} Y^T Y= \Lambda$,所以只需更新 $Y{PCAwhite}=Y\Lambda^{-1/2}$

ZCA白化

ZCA (Zero-phase Component Analysis Whitening) 在PCA白化的基础上,把数据变换回原空间。更新公式 $Y{ZCAwhite}=Y{PCAwhite}P^T$,可检验 $C_Y$,仍满足单位矩阵。