原文标题:We Recommend a Singular Value Decomposition
这篇文章介绍SVD的几何含义及一些应用。
/*注释内的是我自己加的。之前看了一篇文章《理解矩阵》 也挺不错的,推荐看看 */
David Austin
Grand Valley State University
david at merganser.math.gvsu.edu
简介
SVD算是大学线性代数的标配课程内容吧,但貌似没引起多少关注。实际上,SVD除了有很直观的几何解释,还相当有用。比如Netflix(一个在线电影租借公司)为提高电影推荐系统10%精确度悬赏一百万美刀奖金。这问题咋一看好像挺简单,实际上可是很有挑战性。参赛选手用的方法牛B哄哄,但核心就是SVD。
SVD把一个保存有我们感兴趣信息的大矩阵分解成小的、更有含义的小矩阵。这篇文章将介绍SVD的几何含义及一些应用。
SVD把一个保存有我们感兴趣信息的大矩阵分解成小的、更有含义的小矩阵。这篇文章将介绍SVD的几何含义及一些应用。
线性变换的几何含义
从一个简单的2*2矩阵开始/*举例子的话,通常选择2维或者3维*/,第一个例子是一个对角矩阵
几何上,如果我们有一个点(x,y),左乘这个矩阵M就相当把这个点移动到平面上的其他位置。/*矩阵描述一种变换*/
直观上的效果如下图,水平伸缩3倍,垂直方向不变/*提示:看四个顶点的变换。*/。
看上去挺神奇的,我们看一下另外一个矩阵
效果如下:
看上去不是很直观,左旋转45度看看。
/*头往左旋转45度,治疗一下颈椎病*/和原来一样,也是水平伸缩3倍了。/*原来的正方形方向没对好,所以被拉成菱形了*/
M为对称矩阵是种特殊情况,因为M的转置还是M/*那这又代表啥?*/。如果我们有一个对称的2*2矩阵,(向量)左乘这个矩阵对应的变换其实是沿着某种(旋转后的)坐标轴做伸缩变换。换句话说,对称矩阵的效果跟对角矩阵类似。/*对角矩阵本来就是特殊的对称矩阵*/
数学上,如果有一个对称矩阵M,我们可以找到一组正交向量vi,使Mvi是vi的常数倍。
也就是:
也就是:
λi是一个常数。几何上,这意味着vi乘以M只是简单地伸缩/反射/*反射应该是指乘-1之后翻转吧*/变换。因为这个特性,我们称vi是M的一个特征向量。参数λi为特征值。一个显然的重要结论就是不同特征值对应的特征向量是正交的。
如果我们让网格图跟对称矩阵的特征向量对齐,M对网格的变换跟对特征向量的变换是一致的。
前面举的例子是简单的情况,即只沿一个方向变换。更一般的,我们能否找到更一般的矩阵,从一个正交坐标系映射到另外一个正交坐标系。看下面不对称的例子:
我们称这种效果为切变(shear)
随便找一组跟沿着水平坐标方向的特征向量是挺简单的,但是上图显示这样的特征向量没方法表示从一个正交网格映射到另一个正交网格。没关系,旋转30度看看。
虽然没成功,观察一下右边的图,以原点为顶点,红色多边形形成的夹角变大了点。貌似离成功更近一步了。调大角度,这次旋转60度。
嚓,右边快要变成红色差长方体了。实际上,得旋转58.28度才是妥妥的正方体/*用octave验证。m=[1,1;0,1]; [a b] = eig(m'*m); atan(0.85065/0.52573)/pi*180 ; ans=58.283*/。
/*
想想看,我们可以摆放好一个正方形,使其在横向拉扯(切变)
后,还是长方体。
可以小结一下,所谓的矩阵,描述了一个变换。最一般的情况,把一个正方体缩放并旋转,如果矩阵是对称的,那就只缩放,如果是对角矩阵,那这个正方体只能对齐坐标轴,缩放。
*/
奇异值分解
2*2矩阵奇异值分解的几何本质是:任意一个2*2矩阵总能对应从一个正交网格到另一个正交网格的映射
我们用向量来描述一下这个结论:选好一组正交单位向量v1和v2后,Mv1和Mv2也是正交的。
我们用向量来描述一下这个结论:选好一组正交单位向量v1和v2后,Mv1和Mv2也是正交的。
我们用u1和u2这两个单位向量来表示Mv1和Mv2的方向。Mv1和Mv2的长度用σ1和σ2--也就是正交网格(对应u1、u2方向)的伸缩长度。这个神奇的数值我们叫M的奇异值。
根据定义,我们有
(1)
我们可以简单描述一下M对x的效果,
因为v1和v2是正交的,我们有
(2) /* v1和v2是基,v1·x就是x在v1方向的长度 */
乘上M有
(3)
点乘可以换成转置后的向量相乘
(4)
把(1) (4) 代入(3),有
(5)
能推导出 /*后面两行是我补的*/
有了这东西,svd就比较直观了。V是原始域的正交基的集合,U是上域/*变换后的值域*/的正交基的集合,Σ表示一个用V表示的向量变换到U,缩放了多少。
怎么求解奇异值分解
奇异值分解的牛B之处在于我们能推广到求任意矩阵的svd。怎么求?我们回到最初的例子。我们给原始域加上一个单位圆,上域就变成椭圆了,而且椭圆的长轴和短轴刚好是正交基。/*用单位圆的好处;用正方形就得选好位置*/
长轴和短轴 刚好是 Mv1 和 Mv2,而且就是原先单位向量中变换后最长和最短的向量。.
换句话说,在单位圆上,函数|Mx|在v1取得最大值,在v2取得最小值。这样其实就是一个标准的最优值求解问题了。这里关键点就是求矩阵/*具体原因本文没深入说明*/的特征向量。显然是对称的,不同特征值对应的特征向量是正交的,我们可以求得一组正交的Vi。
奇异值就是 σi = |Mvi|, 向量Ui是由单位向量经 Mvi 映射来的。映射后的向量组 Ui 也是正交的么?
假设σi和σj是不同的奇异值,我们有
方便起见,假设奇异值非0。
一方面,下面这个式子等于0因为对称矩阵的特征向量间是正交的。
一方面,下面这个式子等于0因为对称矩阵的特征向量间是正交的。
所以Ui和Uj也是正交的。所以我们找到正交向量集合Vi转换成Ui后也是正交的,而奇异值表述了这其中变换大小。
实际应用的不会这样来求svd,因为不够高效也不好算。
实际应用的不会这样来求svd,因为不够高效也不好算。
另外的一个例子
奇异矩阵
几何效果就是
奇异值就剩下
所以,如果有奇异值为0,svd分解的时候对应项就没了。其实仔细想想,矩阵的轶刚好就是非0奇异值的个数。
数据压缩
svd用来表示数据可以提高效率。举个栗子,我们要压缩下面这个图像,一个15*25的黑白格子。
仔细观察可以发现其实也就3种不同列,显然可以压缩一下。
把黑白图像转成0-1矩阵
svd后,只剩下3个特征值
σ1 = 14.72
σ2 = 5.22
σ3 = 3.31
σ2 = 5.22
σ3 = 3.31
那矩阵就可以表示为
也就是说我们保留3个向量Vi,每个向量15个元素,3个向量Ui,每个向量25个元素,3个奇异值σi。也就是说我们用123个数字就表示了原来375个数字。这里svd通过发现矩阵的冗余来压缩矩阵。
特征值刚好有3个,也就是说矩阵的轶也是3。
/*可以自己用octave做一下小实验。
m=[1,1,1,1,1;
0,1,0,1,0
0,1,0,1,0
0,1,0,1,0
0,1,1,1,0];
0,1,0,1,0
0,1,0,1,0
0,1,0,1,0
0,1,1,1,0];
[a b c] = svd(m);
a(:,1)*b(1,1)* c(:,1)' + a(:,2)*b(2,2)*c(:,2)' + a(:,3)*b(3,3)*c(:,3)'
#神奇的变成原矩阵了!
ans =
1.00000 1.00000 1.00000 1.00000 1.00000
0.00000 1.00000 0.00000 1.00000 0.00000
-0.00000 1.00000 0.00000 1.00000 -0.00000
0.00000 1.00000 0.00000 1.00000 0.00000
0.00000 1.00000 1.00000 1.00000 0.00000
1.00000 1.00000 1.00000 1.00000 1.00000
0.00000 1.00000 0.00000 1.00000 0.00000
-0.00000 1.00000 0.00000 1.00000 -0.00000
0.00000 1.00000 0.00000 1.00000 0.00000
0.00000 1.00000 1.00000 1.00000 0.00000
*/
降噪
前面的例子里,很多奇异值是0,实际上奇异值越大代表信息越多。现在如果我们用扫描仪把上一个图像扫描进电脑,会发现,难免多了很多噪点。
用同样的方法,我么发现这次特征值不为0很多
σ1 = 14.15
σ2 = 4.67
σ3 = 3.00
σ4 = 0.21
σ5 = 0.19
...
σ15 = 0.05
σ2 = 4.67
σ3 = 3.00
σ4 = 0.21
σ5 = 0.19
...
σ15 = 0.05
只有前3个值比较大,所以
效果如下
Noisy image | Improved image |
数据分析
噪声无处不在,我们收集数据的时候也经常遇到。既然svd能抽取矩阵的重要特征,收集完数据不妨先试试用svd处理一下。
举个栗子,我们收集了如下的数据
举个栗子,我们收集了如下的数据
用矩阵来表示
-1.03 | 0.74 | -0.02 | 0.51 | -1.31 | 0.99 | 0.69 | -0.12 | -0.72 | 1.11 |
-2.23 | 1.61 | -0.02 | 0.88 | -2.39 | 2.02 | 1.62 | -0.35 | -1.67 | 2.46 |
σ1 = 6.04
σ2 = 0.22
σ2 = 0.22
一个比另外一个大这么多,小的很可能就是噪声。去掉之后就剩下U1了
这个小栗子是给PCA(主成分分析)抛砖引玉的,PCA用奇异值来检测数据的依赖和冗余、
svd能用来检测数据里面的分组信息,也就是最开始提到的Netflix推荐系统比赛。物以类聚人以群分啊,通过你给电影的打分能把和你臭味相投的人找出来,这些人打的高分的电影很有可能你也喜欢。
svd能用来检测数据里面的分组信息,也就是最开始提到的Netflix推荐系统比赛。物以类聚人以群分啊,通过你给电影的打分能把和你臭味相投的人找出来,这些人打的高分的电影很有可能你也喜欢。
总结
前面提到,svd其实是线性代数的重要内容。几何解释简单直观,而且是把线性代数应用到实际生活的好技术。只可惜,课程里通常没引起重视。/*哎,说的不就是我么*/这篇文章只是简单阐述了一些要点,严格的推导、或者公式在其他材料很容易找到。我的目的主要也只是让大家对svd有一个直观印象,理解svd的主要思想。
参考资料
- 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.
- If You Liked This, You're Sure to Love That, The New York Times, November 21, 2008.