PCA(Principal Component Analysis)主成分分析

原文:http://blog.csdn.net/orthocenterchocolate/article/details/39401767


今天给大家说说主成分分析这个玩意~那么,首先来说说它是干嘛用的吧,它是就来做特征选择(Feature Selection),或者说降维(Dimension Reduction)的。其实特征选择和降维是有联系的,因为特征选择的结果是把那些有用的特征给选出来,冗余的没用的特征给去掉,那么这样之后特征维数自然而然就降低了。那为什么要做特征选择呢?举个具体例子,假设有一大堆网页,然后想对这些网页做聚类(Clustering),所用特征是网页中文本分词后的各词项的TD-IDF值,那么这个特征有多少维?维数等于分词后能分出的不同的词项的个数,那么这个个数能有多大呢?在我实际的研究工作中所碰到的词项数大约是500W的级别,那么就是说,如果采用这些词项做为特征中的词项,那么特征空间就是500W维的,这是个巨大的数字,会给计算带来灾难,这就是所谓的维灾(Dimension Curse),因此有必要通过特征选择来降维。除此之外,还有别的原因需要做特征选择,比如说现在有一堆用户的数据,想对用户进行聚类,但是现在用户特征很多,其中有很多特征意义不大,如果聚类的时候把这些特征也考虑进去,会干扰聚类的效果,但是特征太多,我们人眼又很难看出什么特征有用,什么特征没用。

        那么PCA是怎么选择特征的呢?它是怎么定义所谓的“有用的特征”?它的思想是这样的:它把高维特征通过线性变换,变换到低维空间中,使得在这个低维空间中,特征的方差尽可能地大。这时低维空间中的特征就是被选择出来的特征,就是所谓的主成分,而其它次要的成分就被剔除了。为什么希望方差大呢?因为方差大,就表示这个维上的数据所包含的信息比较丰富。举个例子,比如现在有10个人的数据,每条数据有两个维:出生地,性别,10个人的出生地各不相同,5男5女。从感觉上看,哪一维所包含的信息量大一些?是不是出生地呢?如果我一说出生地,是不是马上就可以找到那个人了呢?因此出生地各不相同嘛,而性别呢?因此性别只有2种,因此会有大量重复的值,也就是很多人的值都是一样的,这个属性对于人的刻画效果不好,比如你找一个性别是男的人,可以找到5个,这5个人从性别这一维上看,是完全一样的,无法区分。从PCA的角度来看,出生地这个维的方差就要比性别这个维的方差要大,而方差大就说明包含的信息比较丰富,不单一,这样的特征是我们希望留下的,因此就这个例子来看,PCA更倾向于保留出生地这个特征。

        那么是不是简单的就把需要保留的特征留下来,不需要保留的特征去掉就行了呢?比如说刚才那个人的数据的例子,是不是直接把性别这个特征去掉就完了?远远不止那么简单,PCA是把原特征映射到一个低维空间上,使得特征在这个低维空间中的方差最大,如果是直接去掉特征维的话,那么剩下的特征不一定是低维空间中方差最大的。这里要注意一个问题,继续刚才那个人的数据的例子,有2维,性别和出生地,如果用PCA把它降成1维,那么这一维是什么?这是没有定义的,也就是说,这一维既不是性别,也不是出生地,它已经没有定义了,我们只知道它是1维选择出来的特征而已,但这并不影响我们对特征的使用。

        再回想一下刚才说的PCA的思想:它的思想是这样的:它把高维特征通过线性变换,变换到低维空间中,使得在这个低维空间中,特征的方差尽可能地大。下面我们就来看看如何达到这个效果。

        假设有一堆m维的特征:


        我们想把它降到k维,其中k


        这时每个特征就变成了一个值,也就是1维了。注意,现在的α还是未知的,是我们要求的,求出α后,我们就知道降维后的特征是什么样了。

        那么降维后的特征的方差就是:

PCA(Principal Component Analysis)主成分分析_第1张图片


     其中S刚好就是协方差矩阵。

     好了,现在我们的目标就是最大化

,也就是求当是什么的时候,
最大,怎么求呢?我们首先来看看,假如S中的元素都是正的,那我把中的元素取成尽量大,是不是
就越大?那这样就应该是正无穷,这就没法求了,那怎么办?我们要对进行某种限制,在这里,限制满足
这样一来,求解
的最大值就变成了在有限制条件的情况下求,高等数学还记得么?应该怎么求呢?拉格朗日乘子法还有印象么?构造拉格朗日函数:

       然后对求导并令导数为0得: 



       再变换一下得:


       呵呵呵呵呵呵,还记得学过的线性代数么?上面这个形式不就是矩阵S的特征值和特征向量的式子么?其中

是矩阵S的特征值,α是特征值对应的特征向量,而我们要求的就是α,矩阵S的特征向量很容易求,所以我们要求的就可以顺利地求出来了。

       这里注意一个问题,可能会有人问,那如果矩阵S有多个特征值,那该选哪个,大家仔细回前面看矩阵S的定义,可以发现,如果你要降到k维,那么矩阵S就是k乘k的,于是S就最多有k个特征值,所以就没得选,刚好够,不多也不少。

       刚才说的是降到一维的情况,那降到k维该怎么办?刚才说到,如果是降到k维,S刚好有k个特征值,于是对应有k个特征向量,假设求出来分别是:

       记矩阵,此时A是m乘k的,那么将原始特征向量降到k维就是:


    至此,我们就完成了将m维特征向量降到k维,在处理大数据时,经常会碰到高维数据,降维是很有用的,有些时间甚至是必须的,因为有时候维数实在太高,算法对高维向量进行运算所需的时间、空间开销是非常巨大的,降维能有效的减小这些开销。但是降维是会常来信息的丢失的,毕竟维数少了,信息量也少了,因此,降维算法实际上就是想在降维的时候,尽量保留有用的信息,去除冗余的信息,可以说降维是用损失一些信息来换取对高维特征向量进行运算所产生的时空开销的削减。

你可能感兴趣的:(PCA(Principal Component Analysis)主成分分析)