特征降维一般有两类方法:特征选择和特征抽取。特征选择即从高纬度的特征中选择其中的一个子集来作为新的特征;而特征抽取是指将高纬度的特征经过某个函数映射至低纬度作为新的特征。常用的特征抽取方法就是PCA。
PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据进行线性变换、映射到低维空间中,使得各维度线性无关的表示,可用于提取数据的主要特征分量。
向量的表示及基变换
向量即为有方向和大小的量,例如a(3,2)本身可以表示向量,其中包含了隐式的定义:以x轴和y轴上正方向长度为1的向量为标准,
,可以证明
即为二维空间中的一组基。
要准确描述向量,首先要确定一组基,然后给出在基所在的各个直线上的投影值,就可以了
一组基的唯一要求就是线性无关,非正交的基也是可以的。
基变换的矩阵表示
可以用矩阵的变换表示上面变量将基变为
:
变换的基向量,原始向量如图:
有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果。数学表示:
其中
是行向量,每一个都是一个基,
是一个列向量,表示原始几率。 R决定了变换后数据的维度
两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去
协方差矩阵及优化目标
如何选择基才是最优的。或者说,如果我们有一组N维向量,现在要将其降到K维(K小于N),那么我们应该如何选择K个基才能最大程度保留原有的信息?
如果我们必须使用低维来表示高纬数据,又希望尽量保留原始的信息,要如何选择?
通过上一节对基变换的讨论我们知道,这个问题实际上是要在二维平面中选择一个方向,将所有数据都投影到这个方向所在直线上,用投影值表示原始记录。这是一个实际的二维降到一维的问题。
那么如何选择这个方向(或者说基)才能尽量保留最多的原始信息呢?一种直观的看法是:希望投影后的投影值尽可能分散。
方差
投影后投影值尽可能分散,而这种分散程度,可以用数学上的方差来表述。
其中,
,即每个字段都均值化为0。
寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大。
协方差
找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向。
单纯只选择方差最大的方向,很明显,这个方向与第一个方向应该是“几乎重合在一起”,因此不希望它们之间存在(线性)相关性的,因为相关性意味着两个字段不是完全独立,必然存在重复表示的信息。
数学上可以用两个字段的协方差表示其相关性,由于已经让每个字段均值为0,则:
当协方差为0时,表示两个字段完全独立。为了让协方差为0,我们选择第二个基时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的。
降维问题的优化目标:将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的K个方差)。
协方差矩阵
对于一个矩阵X:
用X乘以X的转置,并乘上系数1/m:
矩阵对角线上的两个元素分别是两个字段的方差,而其它元素是a和b的协方差。两者被统一到了一个矩阵
优化目标变成了寻找一个矩阵P,满足
是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件。
协方差矩阵C是一个是对称矩阵,在线性代数上,实对称矩阵有一系列非常好的性质:
1)实对称矩阵不同特征值对应的特征向量必然正交。
2)设特征向量
重数为r,则必然存在r个线性无关的特征向量对应于
,因此可以将这r个特征向量单位正交化。
由上面两条可知,一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量,设这n个特征向量为e1,e2,⋯,en,将其按列组成矩阵:
则C:
而
就是变换所需要的矩阵。
按照特征值的从大到小,将特征向量从上到下排列,则用P的前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵Y。
PCA算法
将原始数据按列组成n行m列矩阵X
- 将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值。
- 求出协方差矩阵
- 求出协方差矩阵的特征值及对应的特征向量
- 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
- Y=PX即为降维到k维后的数据
思考
PCA本质上是将方差最大的方向作为主要特征,并且在各个正交方向上将数据“离相关”,也就是让它们在不同正交方向上没有相关性。
PCA缺陷:
- PCA也存在一些限制。例如它可以很好的解除线性相关,但是对于高阶相关性就没有办法了。
- PCA假设数据各主特征是分布在正交方向上,如果在非正交方向上存在几个方差较大的方向,PCA的效果就大打折扣了。
参考
http://blog.codinglabs.org/articles/pca-tutorial.html http://blog.csdn.net/xiaojidan2011/article/details/11595869