摘要:

本文主要讨论的对象是PCA(主成分分析)。

PCA是什么?

PCA(主成分分析)在机器学习中的应用很广泛,通常PCA可以用来对数据进行降维,或者说将数据从高维的空间映射到低维的空间。简单来说,所谓的降维其实就是这么一个过程:

假设原始数据有n个样例,m个特征,也就是n×m的矩阵。把这个n×m的规模的矩阵映射成一个n×k的矩阵过程就是一个降维的过程,特征维度从m降到了k

那很自然地会有一个问题,为什么要降维,也就是维度太高有哪些不好的地方?

1.数据维度太高的时候采用树模型的话就不太合适,因为这个时候特征维度高,特征之间可能存在相关性,一方面数据存在冗余信息,另一方面很多的特征都将得不到使用。

2.数据维度太高时会导致模型变的复杂(因为需要学习的参数变多了,模型自然就变得复杂了)

3.对机器的性能要求也提高了,当数据的特征维度比较高时,这个时候不仅需要更多空间来存储数据,模型的训练也会变慢。

其实上面都是从模型的角度来看的,如果从数据本身来看的话,做降维其实就是为了得到一个质量更加好的数据集。举一个简单的例子,比如有一个数据集如下:
PCA学习记录

上面的数据集中有4条样本,每条样本有3个特征。可以看到对于feature1,其取值全部都是1,很明显,这一个维度其实是冗余的,因为在这个维度上其方差为0,也就是任何样本对于这个特征的取值都是一样,模型在这个维度上学习不到任何的东西,因此我们完全可以把这个维度去掉。

那我们是直接把feature1去掉,然后保留feature2和feature3吗?
这里其实涉及到和 降维很类似的东西 特征选择。

PCA与特征选择

我们知道,特征选择是机器学习一个很重要的步骤。我们有许多做特征选择的方法。
其中判断某一个特征的方差也是一个常用而简单的方法。对于上面的数据集,如果我们进行特征选择的话,很容易就会把feature1去掉,保留feature2,feauture3而且 数值不变,即为下面的数据集:
PCA学习记录
这个时候,特征维度也从3维减少为2维,这里其实也是一个降维的过程。但是其与PCA是完全不一样的结果,如果利用PCA的话,上面数据缩减为2维时的结果如下:
PCA学习记录
可以看到,相比直接的特征选择,其缩减为2维的时候,feature2和feature3在数值是会变化的。

当然原因是因为特征选择是在经过某个指标的分析对比后,直接删掉某个维度的特征来实现特征维度的降低,数值上前后当然不发生变化。而PCA是通过一个映射的关系来实现特征维度的降低,既然经过了映射数值发生变化了是很自然的。

PCA如何实现降维?

上面简单谈了下什么是PCA,以及为何做PCA后,下面就开始分析PCA是如何实现降维的。
PCA的思想其实简单的概括就是:选取包含信息量最多的方向对数据进行投影,其投影方向可以从最大化方差或者最小化投影误差两个角度来理解。

比如说,对二维平面上的点按照下图方向投影时(叉号是原来的点,实心点是投影后的点)
PCA学习记录

对比另外一个投影方向:
PCA学习记录

可以看到,对于第一个投影,投影后的点更加的分散,对于第二个投影,投影后的点相对比较集中。按照最大化方差,第一个投影的效果会更好,更加的分散意味着投影后的方差更大。


可能刚学习PCA的时候都会对为何要最大化方差产生疑问。其实这个问题很好理解,我们可以考虑两个极端的情况,一个就是空间中的点投影后全部到落在了一个点上,另外一个就是空间中的点投影后每一个点都不一样。同时,我们可以把投影后产生的点看成一维新的特征,那么对于前者,既然特征的取值全部都为一样了,这个时候即使降维了,模型也无法从这一个维度中学习到任何的信息。相反,对于后者,由于投影后每一个点都一样,说明这个特征具有一定区分度,同时方差大说明包含的信息量大。
所以PCA的思想就是通过最大化方差来找到合适的投影方向。


下面就是开始用数学的语言来描述PCA的整个过程:

既然我们希望投影后的投影值尽可能的分散,也就是说:
投影后样本点的方差:iUTxixiTU
尽可能的分散等价于最大化方差:Max(iWTxixiTW)


这里简单解释一下为什么投影后的样本点方差是iUTxixiTU

在空间中的一点x,若往方向单位向量u上投影,其投影后的坐标为xTu或者uTx
假如我们的数据集X用矩阵表示如下:

X=[a1a2a3b1b2b3]

每一行代表某一个特征,每一列代表一条样本。
那么假设投影向量为P
P=[u1u2]

将数据集X在P方向上投影:
Y=[u1u2][a1a2a3b1b2b3]=[u1a1+u2b1u1a2+u2b2u1a3+u2b3]

投影后需要计算方差,方差的形式为(xx¯)2x¯为平均值。

投影之后样本点的平均值为:
(u1a1+u2b1)+(u1a2+u2b2)+(u1a3+u2b3)3
整理一下就是:

u1a¯+u2b¯,其中a¯=(a1+a2+a3)/3

所以方差为:
S=(u1a1+u2b1u1a¯u2b¯)2+(u1a2+u2b2u1a¯u2b¯)2+(u1a3+u2b3u1a¯u2b¯)2

==>
S=(u1(a1a¯)+u2(b1b¯))2+(u1(a2a¯)+u2(b2b¯))2+(u1(a3a¯)+u2(b3b¯))2

在这里,我们为了后面计算的方便并且从实际的意义上考虑(同一个尺度下的方差才好对比),需要对原始的数据集X进行中心化,也就是把数据集X按行求平均值之后减去平均值。
这里假设我们已经做了中心化的处理,S就等价于:
S=(u1a1+u2b1)2+(u1a2+u2b2)2+(u1a3+u2b3)2

有点线性代数基础的容易看出来,S可以写成矩阵的形式:
S=(u1a1+u2b1)(u1a1+u2b1)+(u1a2+u2b2)(u1a2+u2b2)+(u1a3+u2b3)(u1a3+u2b3)

==>
S=[u1u2 ][a1b1][a1b1][u1u2]+[u1u2][a2b2][a2b2][u1u2]+[u1u2][a3b3][a3b3][u1u2]

==>
S=[u1u2 ][a1a2a3b1b2b3][a1b1a2b2a3b3][u1u2]
也就是说其实S用矩阵可以写成:
==>S=uTXXTu,而且注意到前面提到u需要是单位向量(只有单位向量的时候投影坐标才是投影方向与原来坐标向量内积)。||u||=1


回到前面的问题,如何求Max(uTXXTu),||u||=1,这个其实是一个带约束的最值问题,所以可以用拉格朗日乘子法。

所以有:
L=uTXXTuλ(1uTu) ,两边对u求导
==>
Lu=2XXTu2λu
==>令偏导为0有:
XXTu=λu

如果对协方差矩阵熟悉的话可以看到,其实XXT对应的就是协方差矩阵
上面的式子意思其实就是求协方差矩阵的特征值和特征向量。
也就是说,协方差矩阵(经过中心化)对应的特征向量就是我们所想寻找的投影方向。而其特征值大小代表着这个投影方向上方差大小程度。

降维

至此,我们完成了降维了吗?
没有!我们上述步骤没有完成降维,我们上面一只都只是找合适的投影方向,或者说在找主成分!我们并没有涉及到降维。但是有了这些主成分后,降维的工作就很简单了。
假设我们希望数据降维后的维度为k,那么我们需要取出前k大特征值所对应的特征向量,k个特征向量所够成的矩阵记为P
然后进行线性的空间变换Y=PX,我们最后得到的Y才是我们降维后的结果。

PCA算法步骤总结

至此,PCA原理的简单介绍已经完毕了,下面我们来总结一下整个PCA算法的流程。

Algorithm 1:PCA()____________________________________:        1.D={x1,x2....xm}        2.k:        1.xi<=xix¯        2.XXT        3.XXT        4.k        :        1.U=(u1,u2...uk)        2.Y=UX        

看到上面的算法步骤,其实PCA的过程是非常简单的。但需要理解其背后的原因却需要良好的线性代数知识做为支撑。

总结:

最后,我们来对PCA做一个小结。
PCA,主成分分析,何为主成分?其实可以理解成一个个投影方向。而PCA要做的就是找到一个合适的投影方向,把原有的高维空间的数据映射到一个低维的空间,从而实现降维。

那么这个方向如何寻找的,标准是什么呢?PCA希望投影后的数据有尽可能大的方差。有了这个目标之后,我们就可以开始用数学语言取描述,后面如何求解这个优化的目标呢?拉格朗日乘子法,最后会发现把问题转成求特征值和特征向量的问题,得到这些投影方向后,自然降维的事情也就水到渠成了。

参考资料:

主成分分析PCA算法:为什么去均值以后的高维矩阵乘以其协方差矩阵的特征向量矩阵就是“投影”?
PCA线性代数讲解
PCA的数学原理
PCA圣经

相关文章: