本文特征分解的思想与奇异值分解类似,以奇异值分解为例。
网上有很多文章都说明了SVD的原理,最终说选取奇异值最大的k个就可以了(没说原因),并给出了这样一个公式:
、、分别表示A矩阵的左奇异矩阵,奇异值对角矩阵和右奇异矩阵。笔者读到这里的时候想到,为什么这样是可行的?为什么选取前几个奇异值很大的矩阵就可以了?
事实上,的格式是这样的:(对于大多数数据集而言,m>n即样本数量大于特征值,因此考虑这种情况。另外再插一句,numpy中奇异值是以array类型返回的,因为除了对角线上都是0,考虑到节省空间,使用一维数组来表示)。其中,、、...、表示奇异值并且按照从大到小排列。
根据矩阵加法,我们把拆解成
根据矩阵乘法分配律
因此,可以看成是矩阵相乘的线性组合,系数(也可以说成是权重)就是、、...、。一般来说,矩阵A的前几个奇异值权重之和就快要接近1,说明矩阵A的产生主要是受到了前几项的影响。想象一下,如果,(前面已经说到这是从大到小排列的),可以认为这一项对矩阵的贡献几乎为0,因此将其舍去。
这也就解释了,在PCA算法中,我们需要选择奇异值较大的前k个项,因为前k个的奇异值比重已经占到了大部分,后面的项对矩阵的贡献已经微乎其微了,相较于维度上的代价,还是把这些项丢掉吧。
那么,当我选择奇异值较大的前k个项时,由于
所以
然后,由于中有很多0的存在,这些0乘上两边的矩阵也是0,因此可以把简化成一个k×k的对角方阵,该矩阵对角线上的值为到,其余是0。取前k列,取前k行,这么取的原因是的第k+1列上的值最终与的第k+1行上的值相乘,而后者都是0。同理。
最后我们得到
综上所述,有
我得到了这个公式,那到底怎么降维呢?
先来说一说矩阵乘法,对于矩阵乘法AB=C,我们可以有如下理解:这里假设
,(b1、b2、...bk是单位向量,即,i=1、2、...k)
那么C就可以表示成
为什么要提及这个?因为我们可以把看做是n维空间的n维向量,把看做是n维空间的k个基向量,那么就是以、、...、为基的新坐标表示的向量。这里就完成了数据的压缩。如果你还不明白,想一想是什么?是向量在方向上的投影长度,因为我已经让 ,所以,这个就是在方向上投影的坐标大小,而不在方向上的投影(就是与正交的方向上的投影),则被丢失(也就是数据被压缩了)。
举个例子,假设,在一个二维坐标系上表示就是点(1,1),点(2,1)和点(-1,0),读者可以自己找张纸画一下。我希望把数据从二维压缩成一维,我需要找一个新基,假设这个新基,那么上述三个点投影到这个新基的坐标就是
,这三个点的新坐标就是(1),(1),(-2),这个基比较特殊,就是原来的y方向,读者也可以换个基再试试。
说了一大堆,回到SVD上面来,我们已经认可了下面这个等式
不妨把不等号改成等号,两边先后右乘上、,原式可变为
又因为矩阵是单位正交矩阵,有,所以上式可写成
这里就是把原有数据集从n维投影到了k维空间上,获得了新的坐标,再乘以一个对角矩阵,此时将该对角矩阵视为某种线性变换(通常而言,线性变换是指左乘一个矩阵,那是因为原始矩阵是以行数来作为维度,即如果有2行,那维度就是2,从而对行线性变换。而这里是以列的数目作为维度,因此右乘一个线性变换矩阵相当于对原始矩阵的列做线性变换),即相当于对坐标进行伸缩。伸缩程度取决于奇异值,但无论如何,数据成功被压缩到了k维空间上。