SVD简介

引言

奇异值分解可以将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示,这些小矩阵描述的是矩阵的重要的特性。就像是描述一个人一样,给别人描述说这个人长得浓眉大眼,方脸,络腮胡,而且带个黑框的眼镜,这样寥寥的几个特征,就让别人脑海里面就有一个较为清楚的认识,实际上,人脸上的特征是有着无数种的,之所以能这么描述,是因为人天生就有着非常好的抽取重要特征的能力,让机器学会抽取重要的特征,SVD是一个重要的方法。在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做feature reduction的PCA,做数据压缩(以图像压缩为代表)的算法,还有做搜索引擎语义层次检索的LSI(Latent Semantic Indexing)

奇异值的作用和特征值有些类似,但是特征值只能应用于方阵,而奇异值分解可以对所有矩阵使用

奇异值的几何意义

要理解奇异值分解的集合意义,首先要对线性代数中的向量、矩阵所表示的几何意义有所了解,这里就不详细写了。具体可见:https://www.bilibili.com/video/av6731067/

我们以2*2的矩阵来举例

22矩阵奇异值分解的几何实质是:对于任意22矩阵,总能找到某个正交网格到另一个正交网格的转换与矩阵变换相对应。

用向量解释这个现象:选择适当的正交的单位向量v1和v2,向量Mv1和Mv2也是正交的。

image_1boe8fm8dsj94gi1jpl1khb13v89.png-18.6kB

image_1boe8fumi9cbunk1ncqtfu1ak8m.png-17.2kB

用u1和u2来表示Mv1和Mv2方向上的单位向量。Mv1和Mv2的长度用σ1 和 σ2来表示——量化了网格在特定方向上被拉伸的效果。σ1 和 σ2被称为M的奇异值。即


image_1boe8iub61lhmlp0qlf1i9a2b513.png-16.9kB

现在给出矩阵M作用于向量x的简单描述。因为向量v1和v2是正交的单位向量,我们有

那么


将点积转换为转置后相乘

通常表述成

这里U是列向量u1和u2组成的矩阵,Σ是非零项为σ1 和 σ2的对角矩阵,V是列向量v1和v2组成的矩阵。

代数角度的奇异值

假设A是一个M N的矩阵,那么得到的U是一个M M的方阵(里面的向量是正交的,U里面的向量称为左奇异向量),Σ是一个M N的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值), 是一个N N的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量),从图片来反映几个相乘的矩阵的大小可得下面的图片

image_1boe9lbaj9oa169b1ot4689tju1g.png-24.1kB

那么奇异值和特征值是怎么对应起来的呢?首先,我们将一个矩阵A的转置 * A,将会得到一个方阵,我们用这个方阵求特征值可以得到:

image_1boe9rc6h1j1rpv06jg65k1n4t1t.png-4.2kB

这里得到的v,就是我们上面的右奇异向量。此外我们还可以得到:

image_1boeci0l63c01p6218c018vf1tov2a.png-4.6kB

这里的σ就是上面说的奇异值,u就是上面说的左奇异向量。奇异值σ跟特征 值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解:

image_1boecnfb4mmsskv6dvqcq1ide2n.png-5.8kB

r是一个远小于m、n的数,这样矩阵的乘法看起来像是下面的样子:

image_1boecomco1gmr53o1k9b1rk8bj934.png-12kB

右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,在这儿,r越接近于n,则相乘的结果越接近于A。而这三个矩阵的面积之和(在存储观点来说,矩阵面积越小,存储量就越小)要远远小于原始的矩阵A,我们如果想要压缩空间来表示原矩阵A,我们存下这里的三个矩阵:U、Σ、V就好了。

SVD应用

SVD与PCA

PCA的全部工作简单点说,就是对原始的空间中顺序地找一组相互正交的坐标轴,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第1、2个轴正交的平面中方差最大的,这样假设在N维空间中,我们可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间了,但是我们选择的r个坐标轴能够使得空间的压缩使得数据的损失最小。

SVD得出的奇异向量是从奇异值由大到小排列的,按PCA的观点来看,就是方差最大的坐标轴就是第一个奇异向量,方差次大的坐标轴就是第二个奇异向量…

image_1boed8rsrbtu13fp910r6ep723u.png-6.6kB

在矩阵的两边同时乘上一个矩阵V,由于V是一个正交的矩阵,所以V转置乘以V得到单位阵I,所以可以化成后面的式子

image_1boed9ql4vlu1lvr1m961rdu17ee4b.png-15.1kB

右乘一个矩阵,相当于对向量进行空间的变换(见第一部分视频)。上面的式子相当于将一个mn的矩阵压缩为了mr的矩阵,即对列进行了压缩。

如何对行进行压缩?

在PCA的观点下,对行进行压缩可以理解为,将一些相似的sample合并在一起,或者将一些没有太大价值的sample去掉。下面写出一个通用的行压缩例子:

image_1boelhnlg11g2r2f13pt17jf1ms74o.png-4.5kB

这样就从一个m行压缩到r行了。

image_1boelimb312ldmdin53u5mgu55.png-6.9kB

这样我们就得到了对行进行压缩的式子。可以看出,其实PCA几乎可以说是对SVD的一个包装,如果我们实现了SVD,那也就实现了PCA了,而且更好的地方是,有了SVD,我们就可以得到两个方向的PCA,如果我们对A’A进行特征值的分解,只能得到一个方向的PCA。

奇异值与潜在语义索引LSI的关系(之后再补充)

参考:

http://www.ams.org/samplings/feature-column/fcarc-svd

http://www.flickering.cn/%E6%95%B0%E5%AD%A6%E4%B9%8B%E7%BE%8E/2015/01/%E5%A5%87%E5%BC%82%E5%80%BC%E5%88%86%E8%A7%A3%EF%BC%88we-recommend-a-singular-value-decomposition%EF%BC%89/

http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html