主成分分析(PCA,principle component analysis)算法是一种机器学习中常用的降维算法,这种算法可以用在数据压缩降维,这样可以加快机器学习的速度,PCA还可以用在数据可视化上,因为高维的特征数据是无法观察的,我们可以通过PCA算法将高维的数据降到2维或者3维,这样就可以在坐标系中体现出来。
首先我们来看看PCA降维的原理,假设在
R
n
{R^n}
Rn空间中有m个点
{
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
m
)
}
\{ {x^{(1)}},{x^{(2)}},...,{x^{(m)}}\}
{x(1),x(2),...,x(m)},我们希望对这些点进行压缩,当然压缩是有损失的,我们目标是将这些损失减到最小。编码这些点的一种方式就是用低维表示,对于每个点
x
(
i
)
∈
R
n
{x^{(i)}} \in {R^n}
x(i)∈Rn,会有一个对应的编码向量
c
(
i
)
∈
R
l
{c^{(i)}} \in {R^l}
c(i)∈Rl,
l
{l}
l表示向量的特征数。我们希望找到一个编码函数,根据我们的输入数据返回编码,
f
(
x
)
=
c
f(x) = c
f(x)=c;当然有编码也有解码,我们也希望找到一个解码函数,这个函数可以重构我们的输入,
x
=
g
(
f
(
x
)
)
x=g(f(x))
x=g(f(x))。
PCA由我们选择的解码函数而定,为了简化解码器,我们使用矩阵乘法将编码映射回
R
n
{R^n}
Rn,即
g
(
c
)
=
D
c
g(c) = Dc
g(c)=Dc,在这个式子中D表示
R
n
×
l
{R^{n \times l}}
Rn×l的解码矩阵。
首先,我们需要明确如何根据每一个输入
x
x
x得到一个最优编码
c
∗
{c^*}
c∗,一种方法是最小化原始输入向量
x
x
x和重构向量
g
(
c
∗
)
g(c^*)
g(c∗)之间的距离,一般来说,我们使用范数来衡量
x
x
x和
g
(
c
∗
)
g(c^*)
g(c∗)之间的距离,PCA算法中,我们使用2范数,这样一来PCA算法就可以转化成求最优解的问题:
c
∗
=
arg
min
c
∥
x
−
g
(
c
)
∥
2
{c^*} = \mathop {\arg \min }\limits_c {\left\| {x - g(c)} \right\|_2}
c∗=cargmin∥x−g(c)∥2然而这个问题可以等价成:
c
∗
=
arg
min
c
∥
x
−
g
(
c
)
∥
2
2
{c^*} = \mathop {\arg \min }\limits_c \left\| {x - g(c)} \right\|_2^2
c∗=cargmin∥x−g(c)∥22
这个表达式最小化的部分可以表示成:
(
x
−
g
(
c
)
)
T
(
x
−
g
(
c
)
)
{(x - g(c))^T}(x - g(c))
(x−g(c))T(x−g(c))
我们将这个数学表达式进行展开:
(
x
−
g
(
c
)
)
T
(
x
−
g
(
c
)
)
=
x
T
x
−
x
T
g
(
c
)
−
g
(
c
)
T
x
+
g
(
c
)
T
g
(
c
)
{(x - g(c))^T}(x - g(c)) = {x^T}x - {x^T}g(c) - g{(c)^T}x + g{(c)^T}g(c)
(x−g(c))T(x−g(c))=xTx−xTg(c)−g(c)Tx+g(c)Tg(c)
因为
g
(
c
)
x
T
=
(
g
(
c
)
T
x
)
T
=
x
T
g
(
c
)
g(c){x^T} = {(g{(c)^T}x)^T} = {x^T}g(c)
g(c)xT=(g(c)Tx)T=xTg(c),所以上述公式可以写成:
x
T
x
−
2
x
T
g
(
c
)
+
g
(
c
)
T
g
(
c
)
{x^T}x - 2{x^T}g(c) + g{(c)^T}g(c)
xTx−2xTg(c)+g(c)Tg(c)因为
x
T
x
{x^T}x
xTx与
c
c
c是不相关的,所以我们可以重新调整我们的优化目标函数:
c
∗
=
arg
min
c
[
−
2
x
T
g
(
c
)
+
g
(
c
)
T
g
(
c
)
]
{c^*}{\text{ = }}\mathop {\arg \min }\limits_c [ - 2{x^T}g(c) + g{(c)^T}g(c)]
c∗ = cargmin[−2xTg(c)+g(c)Tg(c)]
因为之前定义过
g
(
c
)
=
D
c
g(c) = Dc
g(c)=Dc,我们将
g
(
c
)
g(c)
g(c)带入目标函数中可以得到:
c
∗
=
arg
min
c
[
−
2
x
T
D
c
+
c
T
D
T
D
c
]
{c^*} = \mathop {\arg \min }\limits_c [ - 2{x^T}Dc + {c^T}{D^T}Dc]
c∗=cargmin[−2xTDc+cTDTDc]
为了简化我们的PCA算法,我们假设D是正交矩阵,那么我们就可以将目标函数简化:
c
∗
=
arg
min
c
[
−
2
x
T
D
c
+
c
T
I
l
c
]
=
arg
min
c
[
−
2
x
T
D
c
+
c
T
c
]
{c^*} = \mathop {\arg \min }\limits_c [ - 2{x^T}Dc + {c^T}{I_l}c]=\mathop {\arg \min }\limits_c [ - 2{x^T}Dc + {c^T}c]
c∗=cargmin[−2xTDc+cTIlc]=cargmin[−2xTDc+cTc],简化了目标函数之后,我们可以将目标函数对
c
c
c求偏导:
∂
[
−
2
x
T
D
c
+
c
T
c
]
∂
c
=
∂
[
−
2
c
T
D
T
x
+
c
T
c
]
∂
c
=
−
2
D
T
x
+
2
c
=
0
\frac{{\partial [ - 2{x^T}Dc + {c^T}c]}}{{\partial c}} = \frac{{\partial [ - 2{c^T}{D^T}x + {c^T}c]}}{{\partial c}} = - 2{D^T}x + 2c = 0
∂c∂[−2xTDc+cTc]=∂c∂[−2cTDTx+cTc]=−2DTx+2c=0
由上述表达式我们可以得到
c
=
D
T
x
c = {D^T}x
c=DTx,那么就有编码函数
c
=
f
(
x
)
=
D
T
x
c=f(x)={D^T}x
c=f(x)=DTx。为了便于理解,我们可以将2D降维到1D为例,当二位向量向一维向量映射的时候,映射后的数据分布更分散,我们就会认为数据降维的效果就越好,数据的方差就越大,所以我们PCA降维的目标就是最大化投影方差。因为维度是1,所以我们D可以简化成d,因此
x
(
i
)
{x^{(i)}}
x(i)在d上的投影坐标可以表示成两个向量的内积
(
x
(
i
)
,
d
)
=
[
x
(
i
)
]
T
d
({x^{(i)}},d) = {[{x^{(i)}}]^T}d
(x(i),d)=[x(i)]Td,我们目标要找到这个投影方向d,使得我们的数据
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
n
)
{x^{(1)}},{x^{(2)}},...,{x^{(n)}}
x(1),x(2),...,x(n)在d上的投影方差最大,点更加分散。投影之后的方差可以表示成:
D
(
x
)
=
1
n
∑
i
=
1
n
(
x
(
i
)
T
d
)
2
=
1
n
∑
i
=
1
n
(
x
(
i
)
T
d
)
T
(
x
(
i
)
T
d
)
D(x) = \frac{1}{n}\sum\limits_{i = 1}^n {{{({x^{(i)}}^Td)}^2} = } \frac{1}{n}\sum\limits_{i = 1}^n {{{({x^{(i)}}^Td)}^T}} ({x^{(i)}}^Td)
D(x)=n1i=1∑n(x(i)Td)2=n1i=1∑n(x(i)Td)T(x(i)Td)
我们将式子展开可以得到:
D
(
x
)
=
1
n
∑
i
=
1
n
d
T
x
(
i
)
x
(
i
)
T
d
=
d
T
(
∑
i
=
1
n
x
(
i
)
x
(
i
)
T
)
d
D(x) = \frac{1}{n}\sum\limits_{i = 1}^n {{d^T}{x^{(i)}}{x^{(i)}}^Td} = {d^T}(\sum\limits_{i = 1}^n {{x^{(i)}}{x^{(i)}}^T} )d
D(x)=n1i=1∑ndTx(i)x(i)Td=dT(i=1∑nx(i)x(i)T)d
所以要求解
d
d
d,我们可以将上述式子表示成
arg
max
d
=
d
T
(
∑
i
=
1
n
x
(
i
)
x
(
i
)
T
)
d
\mathop {\arg \max }\limits_d = {d^T}(\sum\limits_{i = 1}^n {{x^{(i)}}{x^{(i)}}^T} )d
dargmax=dT(i=1∑nx(i)x(i)T)d,
s
.
t
.
d
T
d
=
1
s.t. {d^T}d = 1
s.t.dTd=1。这里我们可以引入拉格朗日乘子,可以得到:
F
(
d
,
x
,
λ
)
=
d
T
(
∑
i
=
1
n
x
(
i
)
x
(
i
)
T
)
d
+
λ
(
1
−
d
T
d
)
F(d,x,\lambda ) = {d^T}(\sum\limits_{i = 1}^n {{x^{(i)}}{x^{(i)}}^T} )d + \lambda (1 - {d^T}d)
F(d,x,λ)=dT(i=1∑nx(i)x(i)T)d+λ(1−dTd)我们再将
F
(
d
,
x
,
λ
)
F(d,x,\lambda )
F(d,x,λ)对
d
d
d求偏导,再令其等于0,可以得到
(
∑
i
=
1
n
x
(
i
)
x
(
i
)
T
)
d
=
λ
d
(\sum\limits_{i = 1}^n {{x^{(i)}}{x^{(i)}}^T} )d = \lambda d
(i=1∑nx(i)x(i)T)d=λd,将这个式子带入拉格朗日函数中可以得到:
D
(
x
)
=
d
T
(
∑
i
=
1
n
x
(
i
)
x
(
i
)
T
)
d
=
λ
d
T
d
=
λ
D(x) = {d^T}(\sum\limits_{i = 1}^n {{x^{(i)}}{x^{(i)}}^T} )d = \lambda {d^T}d = \lambda
D(x)=dT(i=1∑nx(i)x(i)T)d=λdTd=λ,最终可以很明显地看出
x
x
x投影之后的方差就是协方差矩阵的特征值,我们要找到最大的方差也就是协方差矩阵的最大特征值,最佳投影方向就是最大特征值所对应的特征向量。
以上就是对PCA降维算法的理解,希望对大家在数据降维方面的理解上有所帮助,文中如有纰漏,也请大家不吝指教,谢谢。