主成分分析(PCA)算法理解

主成分分析(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=cargminxg(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=cargminxg(c)22
这个表达式最小化的部分可以表示成:
( x − g ( c ) ) T ( x − g ( c ) ) {(x - g(c))^T}(x - g(c)) (xg(c))T(xg(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) (xg(c))T(xg(c))=xTxxTg(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) xTx2xTg(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=1n(x(i)Td)2=n1i=1n(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=1ndTx(i)x(i)Td=dT(i=1nx(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=1nx(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=1nx(i)x(i)T)d+λ(1dTd)我们再将 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=1nx(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=1nx(i)x(i)T)d=λdTd=λ,最终可以很明显地看出 x x x投影之后的方差就是协方差矩阵的特征值,我们要找到最大的方差也就是协方差矩阵的最大特征值,最佳投影方向就是最大特征值所对应的特征向量。
以上就是对PCA降维算法的理解,希望对大家在数据降维方面的理解上有所帮助,文中如有纰漏,也请大家不吝指教,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值