例子
在这篇文章中,我们将会侧重于了解PCA(主成分分析)背后的数学原理。由于涉及到一些线性代数的知识,我决定先从最简单的一个例子说起。 我们先看下面这一张图:
为了更方便的理解, 我们这样解释这个图片。 我们有一个数据集, 这个集合中包含了三个点,而这三个点均依赖于 x 和 y。现在这些点都在一个二维的平面上, 在数学上,这句话的意思指的是, 存在一组基, 我们记为 v1v_1v1 和 v2v_2v2, 这三个点的坐标可以用 这组基的线性组合来表示。 例如,
v1=(1,0)v2=(0,1)x1=(1,1)=1×v1+1×v2x2=(2,2)=2×v1+2×v2x3=(3,3)=3×v1+3×v2v_1 = (1,0)\\
v_2 = (0,1)\\
x_1 = (1,1) = 1 \times v_1 + 1 \times v_2\\
x_2 = (2,2) = 2 \times v_1 + 2 \times v_2\\
x_3 = (3,3) = 3 \times v_1 + 3 \times v_2v1=(1,0)v2=(0,1)x1=(1,1)=1×v1+1×v2x2=(2,2)=2×v1+2×v2x3=(3,3)=3×v1+3×v2
这里我们使用了两个基向量。
但是,我们很直观地看出,这三个点实际上都分布在同一条直线上面, 这意味着,我们仅仅需要一个基向量便可以表示出这三个点。例如,我们使用如下基向量:
u=12(1,1)u = \frac{1}{\sqrt{2}}\big( 1,1 \big)u=21(1,1)
那么,我们将会有如下结果:
x1=2ux2=22ux3=32ux_1 = \sqrt{2} u\\
x_2 = 2\sqrt{2} u \\
x_3 = 3\sqrt{2} ux1=2ux2=22ux3=32u
现在我们只需要一个基,就完整的表示了这三个点。
PCA
这个例子实际上就是一个简单的PCA, 重点在于,我们将维度往下降了1。 在实际的问题中,我们往往有很多的数据,例如房价数据,这些数据可能有十万个,而每个数据只依赖于二十个因素, 那么我们就理解成,我们把这十万个点放到了一个二十一维的空间中。 但问题是:我们真的需要这二十一个维度么?
那么PCA将有可能帮助我们把维度降下来,每降一个维度,所带来的计算速度增益是非常可观的。
例子
我们回到例子中, 因为这个例子很简单,我们已经知道了答案。但数学上是怎么算出来的呢? 我们现在就开始计算这个例子。(在这个小节中,我们不去计较其背后的数学原理,就是单纯的计算。)
- 这三个点的坐标是给定的,分别是(1,1)(1,1)(1,1), (2,2)(2,2)(2,2) 和 (3,3)(3,3)(3,3), 我们这里将其表示成一个3×23 \times 23×2的矩阵, 我们同是写出它的转置ATA^TAT:
A=[112233] AT=[123123]A = \begin{bmatrix} 1& 1 \\ 2& 2 \\ 3 &3\end{bmatrix} ~~~~~~~~~~~ A^T = \begin{bmatrix} 1& 2 & 3 \\ 1& 2 & 3 \end{bmatrix} A=⎣⎡123123⎦⎤ AT=[112233] - 分别计算 AATAA^TAAT 和 ATAA^TAATA:
AAT=[246481261218] ATA=[14141414] AA^T = \begin{bmatrix} 2& 4&6 \\ 4& 8 & 12 \\ 6 &12&18\end{bmatrix} ~~~~~~~ A^TA = \begin{bmatrix} 14& 14 \\ 14& 14\end{bmatrix}AAT=⎣⎡246481261218⎦⎤ ATA=[14141414] - 分别计算他们的特征值: λ1=28\lambda_1 = 28λ1=28, λ2=λ3=0\lambda_2 = \lambda_3 = 0λ2=λ3=0。(这里我直接计算了AATAA^TAAT 的特征值,因为这两个矩阵的非零特征值都是一样的,之后会做进一步解释。)
- 分别算出他们的特征向量,并写成矩阵形式。
对于AATAA^TAAT,其特征向量组成的矩阵为:
U=[114102140131400]U = \begin{bmatrix} \frac{1}{\sqrt{14}} & 1 & 0 \\ \frac{2}{\sqrt{14}} & 0& 1 \\ \frac{3}{\sqrt{14}} & 0& 0 \end{bmatrix}U=⎣⎢⎡141142143100010⎦⎥⎤
对于ATAA^TAATA,其特征向量组成的矩阵为:
V=[121212−12]V = \begin{bmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & - \frac{1}{\sqrt{2}}\end{bmatrix}V=[212121−21] - 我们得到了原矩阵A分解:
A=UΣVA = U \Sigma VA=UΣV
其中:
Σ=[2800000]\Sigma = \begin{bmatrix} \sqrt{28} & 0 \\ 0& 0 \\ 0 &0\end{bmatrix}Σ=⎣⎡2800000⎦⎤
这里可以自己验算下。 - 我们计算 UΣU\SigmaUΣ,得到:
UΣ=[20220320]U\Sigma = \begin{bmatrix} \sqrt{2}& 0\\ 2\sqrt{2} & 0 \\ 3\sqrt{2} & 0 \end{bmatrix}UΣ=⎣⎡22232000⎦⎤ - 由此,我们得到了之前的结果, 这三个点可以只用一个基向量表示, 即矩阵V的第一列。 在这种表示下, 其坐标为UΣU\SigmaUΣ。
由此我们完整的计算了一次PCA的过程。 这个算法叫做SVD, 即奇异值分解。
几何解释
PCA 本质上是一种降维的过程, 我们通过对原坐标轴系统进行旋转, 如果数据集可以做降维,则这些数据会分布在一个低维的平面上,而我们就可以利用这个平面的基来表示我们的数据。
在之前的例子中,我们本质上是将整个xy坐标顺时针旋转了45度。
数学解释
- 在这一步中,我们的点是在一个标准的直角坐标系中,其坐标表示就是点的坐标。
- 这里我们需要介绍几个数学定理。
- 定理1: 若A 是一个 m×nm \times nm×n的矩阵,则AATAA^TAAT 会是一个实对称的m×mm \times mm×m矩阵。 同理, ATAA^TAATA 会是一个实对称的n×nn \times nn×n矩阵。
这里的证明就是简单地一句话, 略过。 - 定理2:若A是一个 实对称的m×mm \times mm×m矩阵, 则A 可以对角化。
这个定理会是整个PCA的核心,对角化这三个字包含了以下事实:
我们将会得到 m个特征值(重数不一定为1), 由这m个特征值,我们可以得到m个线性无关的特征向量, 便可以对角化这个矩阵。
这个定理的证明 也不是很难。 我在这里给出一个较简单的证明:
根据Jordan分解定理,我们假设 A 无法被对角化,即存在一个特征值λ\lambdaλ,存在一个不为0的向量v, 我们有:
(A−λI)v≠0(A−λI)2v=0(A - \lambda I)v \neq 0\\ (A - \lambda I)^2v = 0 (A−λI)v̸=0(A−λI)2v=0
由于A 是一个实对称矩阵, 我们得到:
(A−λI)2v=(A−λI)(A−λI)v=(A−λI)T(A−λI)v=0(A - \lambda I)^2v = (A - \lambda I) (A - \lambda I) v = (A - \lambda I) ^T(A - \lambda I) v = 0 (A−λI)2v=(A−λI)(A−λI)v=(A−λI)T(A−λI)v=0
但是:
vT(A−λI)T(A−λI)v=0v^T (A - \lambda I) ^T(A - \lambda I) v = 0vT(A−λI)T(A−λI)v=0
意味着:
(A−λI)v=0(A - \lambda I) v = 0(A−λI)v=0
与假设矛盾。 证毕。
- 在这一步中,我们计算了特征值, 但我其实省去了一个事实: AATAA^TAAT 和 ATAA^TAATA 将会共享所有的非零特征值。这个证明也是很简单的,我们一开始的假设是 A 是一个 m×nm \times nm×n 的矩阵,这并不是一个方阵,但我们可以直接填充成一个n×nn \times nn×n 的方阵(取决于哪一个维度更大)。 用0填充矩阵之后,并不影响我们的计算,因此这两个矩阵将会共享所有非零特征值。
- 剩下的步骤都仅仅是单纯的计算了。
实际应用
至此,我们介绍了整个PCA 的背景知识。 在实际的应用中,我们需要设置一个阈值, 例如 σ=0.1\sigma = 0.1σ=0.1。 当非零特征值小于这个阈值的时候,触发PCA机制,进行降维。
例如我们用之前的例子, 将x2 替换为 (1.9, 2.1), 这时,这三个点并不会处在一条直线上,但是我们可以近似地使用PCA。 因为在这个时候,特征值为:28.006 以及 0.0143, 其中一个特征值远小于我们的阈值, 则我们将其替换成0, 则维度下降1,。