PCA是数据重要特征的提取方法。在描述一个人长得浓眉大眼,方脸,络腮胡,而且带个黑框的眼镜,这样寥寥的几个特征,使得他人脑海里面就有一个较为清楚的认识。实际上,人脸特征有着无数种,之所以能这么描述,是因为人天生就有着非常好的抽取重要特征的能力。奇异值分解是一种有着明显物理意义的方法,它可以将一个比较复杂的矩阵用更小更简单的几个子矩阵的乘积表示,这些小矩阵描述的是原矩阵的重要的特性。特征值分解和奇异值分解有着很紧密的关系,其目的是提取出矩阵最重要的特征。
一、奇异值与特征值基础知识:
1)特征值:
向量v是线性变换A的特征向量,如果满足:
称λ为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。通过特征值分解可将一个矩阵分解成下面的形式:
其中Q是A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值。
矩阵M乘以一个向量(x,y)也就是对向量施加线性变换的结果是
如图所示
上面的矩阵是对称的,所以这个变换是一个对x,y轴的方向一个拉伸变换,当矩阵不是对称的时候,如矩阵:
描述的变换
这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个),对变换进行描述可归结为描述变换主要的变化方向。特征值分解得到的对角阵Σ,对角线元素即特征值是由大到小排列的,特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化按特征值大小排列)
当线性变换矩阵维数较高时,有很多的变换方向。通过上述相似的处理方法,通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。利用这N个变化方向,就可以近似描述变换,从而达到提取这个矩阵最重要的特征的目的。可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。
2)奇异值:
特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,怎样才能描述普通的矩阵的重要特征呢?奇异值分解是一个能适用于任意的矩阵的一种分解的方法:
假设A是一个M*N的矩阵,那么得到的U是一个M*M的方阵(里面的向量是正交的,U里面的向量称为左奇异向量),Σ是一个M*N的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值),V’(V的转置)是一个N*N的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量),从图片来反映几个相乘的矩阵的大小可得下面的图片
奇异值分解和特征值分解之间的关系
对于方阵A’A,求其特征值分解
得到的特征向量v,就是奇异值分解中的右奇异向量。此外
这里的σ就是上面说的奇异值,u就是上面说的左奇异向量。奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r个大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解:
r是一个远小于m、n的数,这样矩阵的乘法看起来像是下面的样子:
右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,r越接近于n,则相乘的结果越接近于A。而这三个矩阵存储量要远远小于原始的矩阵A。
二、奇异值分解(SVD)与主成分分析(PCA):
PCA的问题其实是一个基的变换,使得变换后的数据有着最大的方差。对于用于机器学习的数据特别是训练数据,方差大才有意义,不然输入的数据都是同一个点,方差为0,输入的多个数据就等同于一个数据了。以下面这张图为例子:
这个假设是一个摄像机采集一个物体运动得到的图片,上面的点表示物体运动的位置,假如我们想要用一条直线去拟合这些点,那我们会选择什么方向的线呢?当然是图上标有signal的那条线。如果我们把这些点单纯的投影到x轴或者y轴上,最后在x轴与y轴上得到的方差是相似的(因为这些点的趋势是在45度左右的方向,所以投影到x轴或者y轴上都是类似的)。但是如果我们进行坐标系的变化,横轴变成了signal的方向,纵轴变成了noise的方向,则容易发现什么方向的方差大,什么方向的方差小了。
一般来说,方差大的方向是信号的方向,方差小的方向是噪声的方向,在数据挖掘中或者数字信号处理中,往往要提高信号与噪声的比例,也就是信噪比。对上图来说,如果只保留signal方向的数据,也可以对原数据进行不错的近似了。
PCA的全部工作简单点说,就是在原始空间中顺序地找一组相互正交的坐标轴,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第1、2个轴正交的平面中方差最大的,这样假设在N维空间中,我们可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间了,但是我们选择的r个坐标轴能够使得空间的压缩使得数据的损失最小。
还是假设我们矩阵每一行表示一个样本,每一列表示一个feature,用矩阵的语言来表示,将一个m*n的矩阵A的进行坐标轴的变化,P表示从一个N维的空间变换到另一个N维的空间的变换矩阵,在空间中就会进行一些类似于旋转、拉伸的变化。
将一个m * n的矩阵A变换成一个m * r的矩阵,这样就会使得本来有n个feature的,变成了有r个feature了(r<n),这r个其实就是对n个feature的一种提炼,我们就把这个称为feature的压缩。用数学语言表示就是:
但是这个怎么和SVD扯上关系呢?之前谈到,SVD得出的奇异向量也是按奇异值由大到小排列的,按PCA的观点来看,就是方差最大的坐标轴就是第一个奇异向量,方差次大的坐标轴就是第二个奇异向量。我们回忆一下之前得到的SVD式子:
在矩阵的两边同时乘上一个矩阵V,由于V是一个正交的矩阵,所以V转置乘以V得到单位阵I,所以可以化成后面的式子
将后面的式子与A*P那个m * n的矩阵变换为m * r的矩阵的式子对照看看,在这里,其实V就是P,也就是一个变化的向量。这里是将一个m * n 的矩阵压缩到一个m * r的矩阵,也就是对列进行压缩,如果我们想对行进行压缩(在PCA的观点下,对行进行压缩可以理解为,将一些相似的sample合并在一起,或者将一些没有太大价值的sample去掉)怎么办呢?同样我们写出一个通用的行压缩例子:
这样就从一个m行的矩阵压缩到一个r行的矩阵了,对SVD来说也是一样的,我们对SVD分解的式子两边乘以U的转置U'
这样我们就得到了对行进行压缩的式子。可以看出,其实PCA几乎可以说是对SVD的一个包装,如果我们实现了SVD,那也就实现了PCA了,而且更好的地方是,有了SVD,我们就可以得到两个方向的PCA,如果我们对A’A进行特征值的分解,只能得到一个方向的PCA。
参考资料:
1)A Tutorial on Principal Component Analysis,Jonathon Shlens
2)http://www.ams.org/samplings/feature-column/fcarc-svd
3)http://www.puffinwarellc.com/index.php/news-and-articles/articles/30-singularvalue-decomposition-tutorial.html
4)http://www.puffinwarellc.com/index.php/news-and-articles/articles/33-latent-semantic-analysis-tutorial.html
svd与LSI的好文,我后面LSI中例子就是来自此
5)http://www.miislita.com/information-retrieval-tutorial/svd-lsi-tutorial-1-understanding.html
另一篇svd与LSI的文章,也还是不错,深一点,也比较长
6)Singular Value Decomposition and PrincipalComponent Analysis, Rasmus Elsborg Madsen, Lars Kai Hansen and Ole Winther,2004
跟1)里面的文章比较类似