一、PCA的目的
假设我们有一堆观测到的数据。
数据的格式是observation*feature,每一行是一个观测(也就是图里的一个点),每一列是这个数据的某个特征(即一个维度)。
假设数据矩阵是A,有m个观测和n个特征。那么我们的数据
A
∈
R
m
×
n
A \in \R^{m \times n}
A∈Rm×n
举例1:每一行是一个人类,每列分别是身高、体重等等。
举例2:每一行是一个细胞,每列是某一个基因。
数据在以特征张成的空间(每个维度都是一个特征的空间)中符合某种分布。
我们可以给这个数据画一个图(假设只有两个特征):
那么,PCA的目的就是,在空间里找到某一组正交基(一组PC),使得我们能够在更少的维度下,保留尽可能多的数据内的信息。
二、PCA的作用
大家可能或多或少听过,"PCA的作用是降维“。它降维的方法就是找到一组正交基,使得序号在前的基(也就是PC)包含更多的信息,然后选取前x个基,从而保留尽可能多信息(即损失尽可能少的信息)。
比如我们有1000张同样大小(200×200像素)的图片,那么把每张图片用一个向量表示(向量长度40000,前200个值是图片的第一行,200-400是图片的第二行,以此类推),再把每个向量/图片作为一行,每个像素点的值作为一列,就可以得到一个1000*40000的矩阵。
如果我们想把这些图片进行压缩,就可以对这个矩阵进行PCA,得到一组正交基;然后选取这些正交基的前n个,这样就得到了压缩过的1000张图片(1000×n)。
那么,PCA是如何实现的呢?实现的思路是什么?
三、PCA的思路
- 假设我们想把数据降维到1维。也就是把数据投影到一个方向上,使得数据在这个方向上保留的信息最多。
如何体现”信息多“?可以有两种理解方法:
① 损失的信息少,也就是所有点到这个方向上的投影距离之和最小。
Image credit: [1]
为了使投影距离之和最小,投影到的这条线一定是过数据的中心点的(就是mean点)。
所以在做后续操作之前,我们需要把数据中心化,也就是 A = A − m e a n ( A ) A=A-mean(A) A=A−mean(A)。
② 保留的信息多。也就是当每个点投影到当前维度之后,所有投影点的方差最大。
(为什么方差大就代表信息多?需要从方差的计算来思考。)
V a r i a n c e = ∑ ( x i − x ˉ ) 2 m − 1 Variance =\frac{\sum\left(x_i-\bar{x}\right)^2}{m-1} Variance=m−1∑(xi−xˉ)2,方差正比于所有点到均值点的距离平方和。
这两种方法其实是等价的。
如上图,红线是投影目标向量,p是当前点的投影距离,d是投影点到中心点的距离,r是当前点到中心点的距离。
我们把投影目标向量绕中心点旋转,r不变,有: r 2 = p 2 + d 2 r^2=p^2+d^2 r2=p2+d2。因此,最大化距离和最小化方差是在做同一个事情。 - 假设我们已经确定了降维到的前x维的方向,需要确定第x+1维的方向。
那么首先,我们找到的方向必须和之前的x维正交。因为如果不正交,那么两个方向向量之间是有一部分”重复信息“的,会导致新的这个方向能够引入的新信息变少。
其次,我们希望这个新方向在排除之前的维度所包含的信息之后,仍然包含最多信息的。(也就是投影距离最大,方差最小)
以此类推,找到最多n个方向。
四、PCA的实现
了解了PCA的思路之后,我们就可以考虑怎么实现了。
目前常用的实现方式有两种:①基于协方差矩阵的,和②基于特征值分解(SVD)的。
先说方法:
①基于协方差矩阵
先求出A的协方差矩阵,然后对协方差矩阵进行特征值分解,得到的特征向量和特征值就是想要的PC及其对应的variance。
②基于特征值分解
对A进行特征值分解
A
=
U
Σ
V
T
A=U\Sigma V^T
A=UΣVT,得到的V就包含想要的PC,
Σ
\Sigma
Σ里面对应的奇异值大小就是PC的排序。
Q: 那么为什么要这样做,以及为什么基于协方差矩阵的V和基于特征值分解的V是相同的呢?
A: 把矩阵A(已经去中心化,后文提到的也都是去中心化的)投影到一个方向
v
v
v,可以表示为:
A
v
Av
Av。这就是矩阵A投影到向量v的结果。
如果我们想求投影点的方差,也就是
∑
(
x
i
−
x
ˉ
)
2
m
−
1
\frac{\sum\left(x_i-\bar{x}\right)^2}{m-1}
m−1∑(xi−xˉ)2,由于A已经去中心化,
x
ˉ
=
0
\bar{x}=0
xˉ=0。
所以方差就是
1
m
−
1
×
∑
x
i
2
\frac{1}{m-1}\times \sum{x_i^2}
m−11×∑xi2,也就是
1
m
−
1
×
∣
∣
A
v
∣
∣
2
\frac{1}{m-1}\times ||Av||_2
m−11×∣∣Av∣∣2。
∣
∣
A
v
∣
∣
2
=
(
A
v
)
T
(
A
v
)
=
v
T
A
T
A
v
||Av||_2=(Av)^T(Av)=v^TA^TAv
∣∣Av∣∣2=(Av)T(Av)=vTATAv。
因此,我们想要找到一个方向
v
v
v,使得
v
T
A
T
A
v
v^T A^TAv
vTATAv最大。
设
v
T
A
T
A
v
=
λ
v^TA^TAv=\lambda
vTATAv=λ,那么有
A
T
A
v
=
λ
v
A^TAv=\lambda v
ATAv=λv,即
v
v
v是
A
T
A
A^TA
ATA的特征向量。
所以,问题就变成了:试图找到使得
A
T
A
A^TA
ATA的特征值最大的特征向量!
①当A是中心化的矩阵时,A的协方差矩阵为
A
T
A
m
−
1
\frac{A^TA}{m-1}
m−1ATA,基于谱定理[2]。所以对协方差矩阵进行特征值分解就可以得PC。
②基于SVD,
A
=
U
Σ
V
T
,
A
T
A
=
V
Σ
2
V
T
A=U\Sigma V^T,A^TA=V \Sigma^2 V^T
A=UΣVT,ATA=VΣ2VT。由于
V
V
V是正交矩阵,有
V
T
=
V
−
1
V^T=V^{-1}
VT=V−1,所以
V
V
V就是对
A
T
A
A^TA
ATA进行特征值分解得到的特征向量矩阵。
参考
[1] https://www.efavdb.com/principal-component-analysis
[2] https://stats.stackexchange.com/a/219344/371987
附:一个从浅到深讲解PCA的方法