PCA 算法公式推导
最近一直在B站上看一个UP主的机器学习白板推导,感觉很有益处,因为之前看过的各种博客似乎都一直强调对EM算法的感性认识,缺少了很多的推导过程。我想,要完全理性地了解这个算法,还是要一步一步地通过推导。
主要参考资料:白板推导视频
台大李宏毅机器学习课程
简述
PCA是一个无监督的降维算法。它要做的事情其实很简单,就是在空间中找多个正交的维度,使得空间中的数据落在这些维度上后尽可能保留最原始的信息。它所遵从的原则是“最大投影方差”和“最小平方误差”(也可以成为最小重构代价)。
在真正认识到PCA后,我甚至觉得它根本算不上什么高深的东西,仅仅就是线性代数上很基础的东西,放到机器学习的课程里,突然就变得高大上了(笑)。
如视频主所说,学习PCA要把握一个中心,两个基本点:
一个中心是指 原始特征空间的重构,从有关向无关(垂直)重构。
两个基本点是指 最大投影方差和最小重构代价这两个求解思路。
用最大投影方差来求PCA
为什么最大投影方差能够保留最多的信息其实一目了然。它还有一个作用是可以忽略掉最后所求向量的法线方向上的误差。所以在机器学习中,预处理加上降维不仅可以加快训练速度,而且很大可能反而使得最终准确率增加。
设空间中的数据为
x
1
,
x
2
⋯
x
n
x_1,x_2\cdots x_n
x1,x2⋯xn,注意数据点本身是一个多维的变量(或者成为向量)。
第一步是求出数据中心点
x
ˉ
\bar{x}
xˉ,再每个数据减去中心点。
第二步是找出一个方向,使得在这个方向上投影的方差最大。在这一步中因为我们要求的仅仅是一个方向,所以可以设这个方向是一个单位向量
u
u
u。即满足
∣
∣
u
∣
∣
=
u
T
u
=
1
||u||=u^Tu=1
∣∣u∣∣=uTu=1
在这个方向上的投影为
(
x
i
−
x
ˉ
)
⋅
u
(x_i-\bar{x})\cdot u
(xi−xˉ)⋅u
J
=
1
n
∑
i
=
1
n
(
(
x
i
−
x
ˉ
)
⋅
u
)
2
=
1
n
∑
i
=
1
n
u
T
(
x
i
−
x
ˉ
)
T
(
x
i
−
x
ˉ
)
u
=
∑
i
=
1
n
u
T
S
u
\begin{aligned} J&=\frac{1}{n}\sum_{i=1}^n((x_i-\bar{x})\cdot u)^2 \\ &=\frac{1}{n}\sum_{i=1}^n u^T(x_i-\bar{x})^T(x_i-\bar{x})u \\ &=\sum_{i=1}^n u^TSu \end{aligned}
J=n1i=1∑n((xi−xˉ)⋅u)2=n1i=1∑nuT(xi−xˉ)T(xi−xˉ)u=i=1∑nuTSu
其中S表示 1 n ( x i − x ˉ ) T ( x i − x ˉ ) \frac{1}{n}(x_i-\bar{x})^T(x_i-\bar{x}) n1(xi−xˉ)T(xi−xˉ)
于是PCA求解成为了一个优化问题:
object funtion:
u
=
arg max
u
u
T
S
u
u=\argmax_{u} u^TSu
u=uargmaxuTSu
subject to:
u
T
u
=
1
u^Tu=1
uTu=1
这个约束问题很简单,直接用拉格朗日乘数法就可以解得。
S
u
=
λ
u
Su=\lambda u
Su=λu
所以所要寻找的第一主成分方向就是 u u u,即是S的特征向量(eigenvector),其中的 λ \lambda λ即是S的最大的特征值(eigenvalue)。
找到第一主成分后可以类似地找到第二主成分,也就是第二大的特征值对应的特征向量……
用最小重构代价
这个要略显复杂一点
J
=
1
n
∑
i
=
1
n
∥
x
i
−
x
^
i
∥
2
=
1
n
∑
i
=
1
n
∥
∑
k
=
1
n
(
x
i
T
w
k
)
u
k
∥
2
=
1
n
∑
i
=
1
n
∑
k
=
1
p
(
x
i
T
u
k
)
2
=
∑
i
=
1
n
1
n
∑
k
=
1
1
(
(
x
i
−
x
ˉ
)
T
u
k
)
2
=
∑
k
=
1
k
∑
i
=
1
n
1
n
(
(
x
i
−
x
)
T
u
k
)
2
=
∑
k
=
1
n
u
k
⊤
⋅
S
⋅
u
k
\begin{aligned} J &=\frac{1}{n} \sum_{i=1}^{n}\left\|x_{i}-\hat{x}_{i}\right\|^{2} \\ &=\frac{1}{n} \sum_{i=1}^{n}\left\|\sum_{k=1}^{n}\left(x_{i}^{T} w_{k}\right) u_{k}\right\|^{2} \\ &=\frac{1}{n} \sum_{i=1}^{n} \sum_{k=1}^{p}\left(x_{i}^{T} u_{k}\right)^{2} \\ &=\sum_{i=1}^{n} \frac{1}{n} \sum_{k=1}^{1}\left(\left(x_{i}-\bar{x}\right)^{T} u_{k}\right)^{2} \\ &=\sum_{k=1}^{k} \sum_{i=1}^{n} \frac{1}{n}\left(\left(x_{i}-x\right)^{T} u_{k}\right)^{2} \\ &=\sum_{k=1}^{n} u_{k}^{\top} \cdot S \cdot u_{k} \end{aligned}
J=n1i=1∑n∥xi−x^i∥2=n1i=1∑n∥∥∥∥∥k=1∑n(xiTwk)uk∥∥∥∥∥2=n1i=1∑nk=1∑p(xiTuk)2=i=1∑nn1k=1∑1((xi−xˉ)Tuk)2=k=1∑ki=1∑nn1((xi−x)Tuk)2=k=1∑nuk⊤⋅S⋅uk
最后可以得到相同的结果。