1、PCA 算法的数学知识- 特征值分解和奇异值分解:1) 特征值:如果说一个向量 v 是方阵 X 的特征向量,将一定可以表示成下面的形式: Xv这时候 就被称为特征向量 v 对应的特征值,一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式: 1XQ其中 Q 是这个矩阵 X 的特征向量组成的矩阵, 是一个对角阵,每一个对角线上的元素就是一个特征值。首先,要明确的是,乘以一个矩阵其实就是一个线性变换,而且将一个矩阵乘以一个向量后得到的向量,其实就相当于对这个向量进行了线性变换。如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。分解得到的 矩阵是一个对角
2、阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。通过特征值分解得到的前 N 个特征向量,就对应了这个矩阵最主要的N 个变化方向。我们利用这前 N 个变化方向,就可以近似这个矩阵(变换)。也就是:提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。2)奇异值:特征值分解是一个提取矩阵特征很不错的方法
3、,但是它只是对方阵而言的,而奇异值分解是一个能适用于任意的矩阵的一种分解的方法: TXUQV假设 X 是一个 n* p 的矩阵,那么得到的 U 是一个 n * n 的方阵(里面的向量是正交的,U 里面的向量称为左奇异向量), 是一个 n * p 的矩阵(除了对角线的元素都是 0,对角线上的元素称为奇异值), (V 的转置)是一个 p * p 的矩阵,里面的向量也是正交的,TVV 里面的向量称为右奇异向量)。那么奇异值和特征值是怎么对应起来的呢?首先,我们将一个矩阵 X 的转置乘以 X,将会得到一个方阵,我们用这个方阵求特征值可以得到: 这里得到的 v,就是我们上面的()Tiiv右奇异向量。此外
4、我们还可以得到:1iii iiuXv这里的 就是上面说的奇异值,u 就是上面说的左奇异向量。奇异值 跟特征值类似,在矩阵 中也是从大到小排列,而且 的减少特别的快,在很多情况下,前 10%甚至 1%的奇异值的和就占了全部的奇异值之和的 99%以上了。也就是说,我们也可以用前 r 大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解: *TnpnrrpXUVr 是一个远小于 n、p 的数,右边的三个矩阵相乘的结果将会是一个接近于 X 的矩阵,在这儿,r 越接近于 p,则相乘的结果越接近于 X。而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵 X,我们如果想
5、要压缩空间来表示原矩阵 X,我们存下这里的三个矩阵:U 、V 就好了。奇异值与主成分分析(PCA):PCA 的全部工作简单点说,就是对原始的空间中顺序地找一组相互正交的坐标轴,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第 1、2 个轴正交的平面中方差最大的,这样假设在 N 维空间中,我们可以找到 N 个这样的坐标轴,我们取前 r 个去近似这个空间,这样就从一个 N 维的空间压缩到 r 维的空间了,但是我们选择的 r 个坐标轴能够使得空间的压缩使得数据的损失最小。假设矩阵每一行表示一个样本,每一列表示一个特征,用矩阵的语言来表示,对一个 n* p
6、的矩阵 X 进行坐标轴的变化,P 就是一个变换的矩阵,从一个 p 维的空间变换到另一个 p 维的空间,在空间中就会进行一些类似于旋转、拉伸的变化。A*npnpXPX而将一个 n * p 的矩阵 X 变换成一个 n* r 的矩阵,这样就会使得本来有 p 个特征的样本,变成了有 r 个特征了(r p),这 r 个其实就是对 p 个特征的一种提炼。用数学语言表示就是:A*nrnrXP但是这个跟奇异值分解(SVD)什么关系呢?之前谈到, SVD 得出的奇异向量也是从奇异值由大到小排列的,按 PCA 的观点来看,就是方差最大的坐标轴就是第一个奇异向量,方差次大的坐标轴就是第二个奇异向量我们回忆一下之前得
7、到的 SVD 式子:*TnpnrrpXUV在矩阵的两边同时乘上一个矩阵 V,由于 V 是一个正交的矩阵,所以 V 转置乘以 V 得到单位阵 I,所以可以化成后面的式子*TnprnrrprrrrXU将后面的式子与 X * P 那个 n * p 的矩阵变换为 n * r 的矩阵的式子对照看看,在这里,其实 V 就是 P,也就是一个变化的向量,即一组新的坐标基,也叫主成分矩阵,而 相当于原数据在新坐标基*nrU下的坐标,叫做得分矩阵。这里是将一个 n * p 的矩阵压缩到一个 n * r 的矩阵,也就是对列进行压缩。如果我们想对行进行压缩(在 PCA 的观点下,对行进行压缩可以理解为,将一些相似的样本合并在一起,或者将一些没有太大价值的样本去掉)怎么办呢?同样我们写出一个通用的行压缩例子:A*rnprpPX这样就从一个 n 行的矩阵压缩到一个 r 行的矩阵了,对 SVD 来说也是一样的,我们对 SVD 分解的式子两边乘以 U 的转置 U*TTrnprrpUXV这样我们就得到了对行进行压缩的式子。可以看出,其实 PCA几乎可以说是对 SVD 的一个包装,如果我们实现了 SVD,那也就实现了 PCA 了,而且更好的地方是,有了 SVD,我们就可以得到两个方向的 PCA,如果我们对 进行特征值的分解,只能得到一TX个方向的 PCA。