[转帖] 奇异值分解(We Recommend a Singular Value Decomposition)

http://www.flickering.cn/nlp/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/#jtss-tsina
奇异值分解(We Recommend a Singular Value Decomposition)                                                        2015/01/04搜索技术机器学习自然语言处理richardsun                                       
                                        原文作者:David Austin
原文链接: http://www.ams.org/samplings/feature-column/fcarc-svd

译者:richardsun(孙振龙)
在这篇文章中,我们以几何的视角去观察矩阵奇异值分解的过程,并且列举一些奇异值分解的应用。
介绍
矩阵奇异值分解是本科数学课程中的必学部分,但往往被大家忽略。这个分解除了很直观,更重要的是非常具有实用价值。譬如,Netflix(在线电影租赁公司)对能够提高其电影推荐系统准确率10%的人提供100万美元的丰厚奖金。令人惊奇的是,这个看似简单的问题却非常具有挑战性,相关的团队正在使用非常复杂的技术解决之,而这些技术的本质都是奇异值分解。
奇异值分解简单来讲,就是以一种方便快捷的方式将我们感兴趣的矩阵分解成更简单且有直观意义的矩阵的乘积。本文以几何的视角去观察奇异值分解的过程,并且列举一些奇异值分解的应用。
线性变换的几何解释
首先,我们来看一个只有两行两列的简单矩阵。第一个例子是对角矩阵

从几何的角度,矩阵可以描述为一个变换:用矩阵乘法将平面上的点(x, y)变换成另外一个点(3x, y):

这种变换的效果如下:平面在水平方向被拉伸了3倍,在竖直方向无变化。


再看下这个矩阵

它会产生如下的效果

不过这张图貌似也并没有能够简洁、清晰的描述出上述矩阵变换的几何效果。然而,如果我们把网格旋转45度,再观察一下。


啊哈!我们看到现在这个新的网格被转换的方式与原始的网格被对角矩阵转换的方式是完全一致的:网格在某一方向上被拉伸了3倍。
当然这是一种特殊的结果,因为矩阵M是对称的,换句话说,M的转置(通过互换矩阵的对角项得到)还等于M。如果我们有一个2*2的对称矩阵,可以证明,我们总是可以通过在平面上旋转网格,使得矩阵变换的效果恰好是在两个垂直的方向上对网格的拉伸或镜面反射。换句话说,对称矩阵表现得像对角矩阵一样。
说的更数学化一些,给定一个对称矩阵M,我们可以找到一组正交向量vi使得Mvi等于vi和标量的乘积;那就是

Mvi = λivi


这里λi是标量。从几何意义上讲,这意味着当vi乘上矩阵M时被简单地拉伸或者反射了。因为这个性质,我们称viM的特征向量;标量λi被称为特征值。一个可以被证明的重要的事实是:对称矩阵不同的特征值对应的特征向量是正交的。如果我们把对称矩阵的特征向量和网格对齐,那么矩阵对网格的拉伸或反射的方式,与矩阵对特征向量的拉伸或反射的方式,两者是完全一致的。
上述线性变换的几何解释非常简单:网格在某个方向上被简单地拉伸了。对于更一般的矩阵,我们将要问的问题是: 能否能找到某个正交网格,在矩阵变换之下,变成另一个正交网格? 让我们最后来考虑一个非对称矩阵的例子:

这个矩阵产生的几何效果是切变(shear)。


很容易找到一族沿水平轴的特征向量。但是从上图可以看出,这些特征向量无法把某个正交网格变换到另外一个正交网格。尽管如此,我们先尝试将网格旋转30度,然后看看发生了什么,


注意右侧红色平行四边形在原点形成的夹角已经增加。(译者注:这暗示了,如果我们增加旋转角度,平行四边形在原点形成的夹角可能增加到90度,从而变成正交网格。)  接下来将左侧网格旋转到60度:


右侧的网格现在几乎是正交的。事实上,如果将左侧网格旋转58.28度,左右两个网格就都是正交的了。


奇异值分解
2*2矩阵奇异值分解的几何实质是:对于任意2*2矩阵,总能找到某个正交网格到另一个正交网格的转换与矩阵变换相对应。
用向量解释这个现象:选择适当的正交的单位向量v1v2,向量Mv1Mv2也是正交的。


u1u2来表示Mv1Mv2方向上的单位向量。Mv1Mv2的长度用σ1 和 σ2来表示——量化了网格在特定方向上被拉伸的效果。σ1 和 σ2被称为M的奇异值。(在本例中,奇异值就是黄金比例及其倒数,但它在此不是很重要。)

由此,我们有

Mv1 = σ1u1
Mv2 = σ2u2


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

x = (v1 · x) v1 + (v2 · x) v2


这意味着

Mx = (v1 · x) Mv1 + (v2 · x) Mv2
Mx = (v1 · x) σ1u1 + (v2 · x) σ2u2


注意点积可以用向量的转置来计算

v · x = vTx


我们有

Mx = u1σ1 v1Tx + u2σ2 v2Tx
M = u1σ1 v1T + u2σ2 v2T


通常表述成

M = UΣVT


这里U是列向量u1u2组成的矩阵,Σ是非零项为σ1 和 σ2的对角矩阵,V是列向量v1v2组成的矩阵。带有上标T的矩阵V是矩阵V的转置。
上面描述了怎样将矩阵M分解成三个矩阵的乘积:V描述了原始空间中的正交基,U描述了相关空间的正交基,Σ描述了V中的向量变成U中的向量时被拉伸的倍数。
怎样做奇异值分解?
奇异值分解的魅力在于任何矩阵都可以找到奇异值。怎么做?让我们来看下先前的例子,这回在空间中加入单位圆。在变换后的空间中,单位圆变成了椭圆,其长轴和短轴定义了正交网格。


注意长轴和短轴用Mv1Mv2定义。这两个向量因此成为单位圆里的所有向量中最长的和最短的向量。


换句话讲,单位圆上的向量函数|Mx|在v1上有最大值而在v2上有最小值。这就把原始问题简化为了一个标准的微积分问题:我们在单位圆上去优化一个函数的极值。而这个函数的极值点正好恰恰是矩阵MTM的特征向量。由于该矩阵是对称的,其不同的特征值对应的特征向量之间是正交的。这就产生了向量族vi
奇异值通过σi = |Mvi|得到,uiMvi方向上的单位向量。但是ui之间为什么是正交的呢?
为了解释这个问题,我们假设σi和σj是不同的奇异值。我们有

Mvi = σiui
Mvj = σjuj


让我们从表达式MviMvj开始,为了方便,假定奇异值是非零的。一方面,MviMvj是零,因为作为矩阵MTM的特征向量vi之间是正交的:

Mvi · Mvj = viTMT Mvj = vi · MTMvj = λjvi · vj = 0


另一方面,我们有

Mvi · Mvj = σiσj ui · uj = 0


因此uiuj是正交的,所以我们已经找到能够转换成某个正交向量集ui的正交向量集vi。奇异值描述了在不同方向上拉伸的倍数。
在实践中,这不是获得矩阵奇异值分解的步骤,因为这个方法不是特别高效,或者在数值计算中的表现也不够好。
另外一个例子
让我们看一个奇异矩阵

矩阵的几何效果如下:

在这个例子中,第二个奇异值是零,所以我们可以这样写:

M = u1σ1 v1T


换句话讲,如果一些奇异值为零,相应的项将不会出现在M的分解中。因此,矩阵M的秩(即线性独立的行或列的个数)等于非零奇异值的个数。
数据压缩
奇异值分解可以高效的表示数据。例如,假设我们想传送下列图片,包含15*25个黑色或者白色的像素阵列。

因为在图像中只有三种类型的列(如下),它可以以更紧凑的形式被表示。

            

我们用15*25的矩阵来表示这个图像,其中每个元素非0即1,0表示黑色像素,1表示白色像素。如下所示,共有375个元素。

如果对M进行奇异值分解的话,我们只会得到三个非零的奇异值。

σ1 = 14.72
σ2 = 5.22
σ3 = 3.31


因此,矩阵可以如下表示

M=u1σ1 v1T + u2σ2 v2T + u3σ3 v3T


我们有三个包含15个元素的向量vi,三个包含25个元素的向量ui,以及三个奇异值σi。这意味着我们可以只用123个数字就能表示这个矩阵而不是出现在矩阵中的375个元素。在这种方式下,我们看到在矩阵中有3个线性独立的列,也就是说矩阵的秩是3。
降噪
从之前的例子看出我们利用了矩阵中有很多奇异值为0的特殊性。通常来说,越大的奇异值对应的信息越令人感兴趣。例如,想象我们用扫描仪将上面的图片输入到我们的计算机。但是,我们的扫描机会在图片上产生一些缺陷(通常称作“噪声”)。

我们以同样的方式处理:用15*25矩阵来表示图像,然后进行奇异值分解。我们得到以下奇异值:

σ1 = 14.15
σ2 = 4.67
σ3 = 3.00
σ4 = 0.21
σ5 = 0.19

σ15 = 0.05


很明显,头三个奇异值是最重要的,所以我们假定其他的都是图像上的噪声,并假设假设

M≈u1σ1 v1T + u2σ2 v2T + u3σ3 v3T


这就产生了如下的优化后的图片

Noisy image             Improved image



数据分析
我们在收集数据的时候经常会遇到噪声:无论工具多好,总有一些误差在测量过程中。如果我们记得大的奇异值指向矩阵中重要的特征,很自然地想到用奇异值分解去研究被收集的数据。
例如,我们收集了一些数据如下:

如下是我们获得的数据,将其放入矩阵中:
-1.030.74-0.020.51-1.310.990.69-0.12-0.721.11
-2.231.61-0.020.88-2.392.021.62-0.35-1.672.46
然后进行奇异值分解。我们得到奇异值

σ1 = 6.04
σ2 = 0.22


其中第一个奇异值远远大于另外一个,很安全的假设小的奇异值σ2是数据中的噪声并且可以理想地认为是0。这个例子中的矩阵的秩是1,意味着所有数据都位于ui定义的线上。

这个简短的例子引出了主成分分析领域,展示了一系列用奇异值分解来检测数据依赖和冗余的技术。
同样地,奇异值分解可以用来检测数据中的簇,这就解释了奇异值分解可以用来尝试优化Netflix的电影推荐系统。程序会根据你看过的电影来对与你看过的电影相似的未看过的电影进行排序。推荐系统会挑选出你未看过的电影集合中预估分高的电影。
总结
如文章的开头所述,奇异值分解应该是本科数学专业线性代数课程的核心部分。除了拥有无比简单的几何解释,奇异值分解提供了将线性代数想法应用于现实的极其有效的技术。然而大家对本科线性代数课程的通常都缺乏足够的重视。
本文可能有点印象派的风格:我的目的是为奇异值分解背后的中心思想提供直观的解释,并通过具体的例子来说明怎么将奇异值分解的思想付诸实践。
References:
  • Gilbert Strang, Linear Algebra and Its Applications. Brooks Cole.Strang’s book is something of a classic though some may find it to be a little too formal.
  • William H. Press et al, Numercial Recipes in C: The Art of Scientific Computing. Cambridge University Press.Authoritative, yet highly readable. Older versions are available online.
  • Dan Kalman, A Singularly Valuable Decomposition: The SVD of a Matrix, The College Mathematics Journal 27 (1996), 2-23.Kalman’s article, like this one, aims to improve the profile of the singular value decomposition. It also a description of how least-squares computations are facilitated by the decomposition.
豆瓣http://www.douban.com/people/knowcraft
博客http://www.yantan.cc/blog/?12226
微博http://weibo.com/1862276280