PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD的几何意义。能在有限的篇幅把这个问题讲解的如此清晰,实属不易。原文举了一个简单的图像处理问题,简单形象,真心希望路过的各路朋友能从不同的角度阐述下自己对SVD实际意义的理解,比如
个性化推荐中应用了SVD,文本以及Web挖掘的时候也经常会用到SVD。
奇异值分解( The singular value decomposition )
该部分是从几何层面上去理解二维的SVD:对于任意的 2 x 2 矩阵,通过SVD可以将一个相互垂直的网格(orthogonal
grid)变换到另外一个相互垂直的网格。
我们可以通过向量的方式来描述这个事实:
首先,选择两个相互正交的单位向量 v1和 v2,
向量Mv1 和 Mv2 正交。
u1 和 u2分别表示Mv1 和 Mv2的单位向量,σ1*u1 =
Mv1 和 σ2*u2 =
Mv2。σ1 和 σ2分别表示这不同方向向量上的模,也称作为矩阵 M 的奇异值。
这样我们就有了如下关系式
Mv1=
σ1u1
Mv2=
σ2u2
我们现在可以简单描述下经过 M 线性变换后的向量 x的表达形式。由于向量v1 和 v2是正交的单位向量,我们可以得到如下式子:
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σ1v1Tx+u2σ2v2Tx
M=u1σ1v1T+u2σ2v2T
上述的式子经常表示成
M=UΣVT
u矩阵的列向量分别是u1,u2,Σ是一个对角矩阵,对角元素分别是对应的σ1 和 σ2,V矩阵的列向量分别是v1,v2。上角标 T 表示矩阵 V的转置。
这就表明任意的矩阵 M 是可以分解成三个矩阵。V表示了原始域的标准正交基,u表示经过 M变换后的co-domain的标准正交基,Σ表示了V中的向量与u中相对应向量之间的关系。(V
describes an orthonormal basis in the domain, and U describes an
orthonormal basis in the co-domain, and Σ describes how much the
vectors in V are stretched to give the vectors in U.)
如何获得奇异值分解?( How do we find the singular
decomposition? )
事实上我们可以找到任何矩阵的奇异值分解,那么我们是如何做到的呢?假设在原始域中有一个单位圆,如下图所示。经过 M矩阵变换以后在co-domain中单位圆会变成一个椭圆,它的长轴(Mv1)和短轴(Mv2)分别对应转换后的两个标准正交向量,也是在椭圆范围内最长和最短的两个向量。
换句话说,定义在单位圆上的函数|Mx|分别在v1和v2方向上取得最大和最小值。这样我们就把寻找矩阵的奇异值分解过程缩小到了优化函数|Mx|上了。结果发现(具体的推到过程这里就不详细介绍了)这个函数取得最优值的向量分别是矩阵
MT M 的特征向量。由于MTM是对称矩阵,因此不同特征值对应的特征向量都是互相正交的,我们用vi
表示MTM的所有特征向量。奇异值σi=
|Mvi| ,
向量 ui为 Mvi 方向上的单位向量。但为什么ui也是正交的呢?
推倒如下:
σi 和 σj分别是不同两个奇异值
Mvi=
σiui
Mvj=
σjuj.
我们先看下Mvi
Mvj,并假设它们分别对应的奇异值都不为零。一方面这个表达的值为0,推到如下
Mvi
Mvj=viTMTMvj=vi
MTMvj=
λjvi
vj=
0
另一方面,我们有
Mvi
Mvj=
σiσjui
uj=
0
因此,ui 和 uj是正交的。但实际上,这并非是求解奇异值的方法,效率会非常低。这里也主要不是讨论如何求解奇异值,为了演示方便,采用的都是二阶矩阵。
应用实例(Another example)
现在我们来看几个实例。
实例一
经过这个矩阵变换后的效果如下图所示
在这个例子中,第二个奇异值为 0,因此经过变换后只有一个方向上有表达。
M =u1σ1v1T.
换句话说,如果某些奇异值非常小的话,其相对应的几项就可以不同出现在矩阵 M 的分解式中。因此,我们可以看到矩阵M 的秩的大小等于非零奇异值的个数。
实例二
我们来看一个奇异值分解在数据表达上的应用。假设我们有如下的一张 15 x 25 的图像数据。
如图所示,该图像主要由下面三部分构成。
我们将图像表示成 15 x 25 的矩阵,矩阵的元素对应着图像的不同像素,如果像素是白色的话,就取 1,黑色的就取 0.
我们得到了一个具有375个元素的矩阵,如下图所示
如果我们对矩阵M进行奇异值分解以后,得到奇异值分别是
σ1=
14.72
σ2=
5.22
σ3=
3.31
矩阵M就可以表示成
M=u1σ1v1T+u2σ2v2T+u3σ3v3T
vi具有15个元素,ui 具有25个元素,σi 对应不同的奇异值。如上图所示,我们就可以用123个元素来表示具有375个元素的图像数据了。
实例三
减噪(noise reduction)
前面的例子的奇异值都不为零,或者都还算比较大,下面我们来探索一下拥有零或者非常小的奇异值的情况。通常来讲,大的奇异值对应的部分会包含更多的信息。比如,我们有一张扫描的,带有噪声的图像,如下图所示
我们采用跟实例二相同的处理方式处理该扫描图像。得到图像矩阵的奇异值:
σ1=
14.15
σ2=
4.67
σ3=
3.00
σ4=
0.21
σ5=
0.19
...
σ15=
0.05
很明显,前面三个奇异值远远比后面的奇异值要大,这样矩阵 M 的分解方式就可以如下:
M
u1σ1v1T+u2σ2v2T+u3σ3v3T
经过奇异值分解后,我们得到了一张降噪后的图像。
实例四
数据分析(data analysis)
我们搜集的数据中总是存在噪声:无论采用的设备多精密,方法有多好,总是会存在一些误差的。如果你们还记得上文提到的,大的奇异值对应了矩阵中的主要信息的话,运用SVD进行数据分析,提取其中的主要部分的话,还是相当合理的。
作为例子,假如我们搜集的数据如下所示:
我们将数据用矩阵的形式表示:
经过奇异值分解后,得到
σ1=
6.04
σ2=
0.22
由于第一个奇异值远比第二个要大,数据中有包含一些噪声,第二个奇异值在原始矩阵分解相对应的部分可以忽略。经过SVD分解后,保留了主要样本点如图所示
就保留主要样本数据来看,该过程跟PCA( principal component
analysis)技术有一些联系,PCA也使用了SVD去检测数据间依赖和冗余信息.
总结(Summary)
这篇文章非常的清晰的讲解了SVD的几何意义,不仅从数学的角度,还联系了几个应用实例形象的论述了SVD是如何发现数据中主要信息的。在netflix
prize中许多团队都运用了矩阵分解的技术,该技术就来源于SVD的分解思想,矩阵分解算是SVD的变形,但思想还是一致的。之前算是能够运用矩阵分解技术于个性化推荐系统中,但理解起来不够直观,阅读原文后醍醐灌顶,我想就从SVD能够发现数据中的主要信息的思路,就几个方面去思考下如何利用数据中所蕴含的潜在关系去探索个性化推荐系统。也希望路过的各位大侠不吝分享呀。
References:
Gilbert Strang,Linear
Algebra and Its Applications.
Brooks Cole
William H. Presset
al,Numercial
Recipes in C: The Art of Scientific Computing.
Cambridge University Press.
Dan Kalman,A Singularly Valuable Decomposition: The SVD of a
Matrix,The
College Mathematics Journal27(1996),
2-23.
=======================================================================
以下为维基百科的解释
===============================================================
理论描述[编辑]
假设M是一个m×n阶矩阵,其中的元素全部属于域 K,也就是 实数域或复数域。如此则存在一个分解使得
其中U是m×m阶酉矩阵;Σ是半正定m×n阶对角矩阵;而V*,即V的共轭转置,是n×n阶酉矩阵。这样的分解就称作M的奇异值分解。Σ对角线上的元素Σi,i即为M的奇异值。
常见的做法是将奇异值由大而小排列。如此Σ便能由M唯一确定了。(虽然U和V仍然不能确定。)
直观的解释[编辑]
在矩阵M的奇异值分解中
V的列(columns)组成一套对
的正交"输入"或"分析"的基向量。这些向量是
U的列(columns)组成一套对
的正交"输出"的基向量。这些向量是
Σ对角线上的元素是奇异值,可视为是在输入与输出间进行的标量的"膨胀控制"。这些是 及 的特征值的非零平方根,并与U和V的行向量相对应。
奇异值和奇异向量, 以及他们与奇异值分解的关系[编辑]
一个非负实数σ是M的一个奇异值仅当存在Km 的单位向量u和Kn的单位向量v如下
:
其中向量u 和v分别为σ的左奇异向量和右奇异向量。
对于任意的奇异值分解
矩阵Σ的对角线上的元素等于M的奇异值. U和V的列分别是奇异值中的左、右奇异向量。因此,上述定理表明:
一个m ×
n的矩阵至少有一个最多有 p =
min(m,n)个不同的奇异值;
总能在Km中找到由M的左奇异向量组成的一组正交基U,;
总能在Kn找到由M的右奇异向量组成的一组正交基V,。
如果对于一个奇异值,可以找到两组线性无关的左(右)奇异向量,则该奇异值称为简并的(或退化的)。
非退化的奇异值在最多相差一个相位因子
(若讨论限定在实数域内,则最多相差一个正负号)的意义下具有唯一的左、右奇异向量。因此,如果M的所有奇异值都是非退化且非零,则除去一个可以同时乘在
上的任意的相位因子外,
的奇异值分解唯一。
根据定义,退化的奇异值具有不唯一的奇异向量。因为,如果u1和u2为奇异值σ的两个左奇异向量,则它们的任意归一化线性组合也是奇异值σ一个左奇异向量,右奇异向量也具有类似的性质。因此,如果M具有退化的奇异值,则它的奇异值分解是不唯一的。
例子[编辑]
观察一个4×5的矩阵
M矩阵的奇异值分解如下
注意矩阵
的所有非对角元为0。矩阵 和
都是酉矩阵,它们乘上各自的共轭转置都得到单位矩阵。如下所示。在这个例子中,由于
和
都是实矩阵,故它们都是正交矩阵。
由于
有一个对角元是零,故这个奇异值分解值不是唯一的。例如,选择 使得
能得到
的另一个奇异值分解。
与特征值分解的联系[编辑]
奇异值分解能够用于任意
矩阵,而特征分解只能适用于特定类型的方阵,故奇异值分解的适用范围更广。不过,这两个分解之间是有关联的。
给定一个M的奇异值分解,根据上面的论述,两者的关系式如下:
关系式的右边描述了关系式左边的特征值分解。于是:
的列向量(右奇异向量)是
的特征向量。
的列向量(左奇异向量)是
的特征向量。
的非零对角元(非零奇异值)是
或者
的非零特征值的平方根。
特殊情况下,当M是一个正规矩阵(因而必须是方阵)根据谱定理,M可以被一组特征向量酉对角化,所以它可以表为:
其中U为一个酉矩阵,D为一个对角阵。如果M是半正定的,
的分解也是一个奇异值分解。
然而,一般矩阵的特征分解跟奇异值分解不同。特征分解如下:
其中U是不需要是酉的,D也不需要是半正定的。而奇异值分解如下:
其中
是对角半正定矩阵,U 和 V是酉矩阵,两者除了通过矩阵M没有必然的联系。
几何意义[编辑]
因为U和V都是酉的, 我们知道U的列向量u1,...,um组成了Km空间的一组标准正交基。同样,V的列向量v1,...,vn也组成了Kn空间的一组标准正交基(根据向量空间的标准点积法则)。
矩阵
代表从
到
的一个线性映射
:
。通过这些标准正交基,这个变换可以用很简单的方式进行描述:
,其中
是
中的第i个对角元。当
时,
。
这样,SVD分解的几何意义就可以做如下的归纳:对于每一个线性映射
,
的奇异值分解在原空间与像空间中分别找到一组标准正交基,使得
把
的第
个基向量映射为
的第
个基向量的非负倍数,并将
中余下的基向量映射为零向量。换句话说,线性变换
在这两组选定的基上的矩阵表示为所有对角元均为非负数的对角矩阵。
应用[编辑]
求伪逆[编辑]
奇异值分解可以被用来计算矩阵的伪逆。若矩阵 M 的奇异值分解为 ,那么 M 的伪逆为
其中
是
的伪逆,是将
主对角线上每个非零元素都求倒数之后再转置得到的。求伪逆通常可以用来求解最小二乘法问题。
列空间、零空间和秩[编辑]
奇异值分解的另一个应用是给出矩阵的列空间、零空间和秩的表示。对角矩阵
的非零对角元素的个数对应于矩阵
的秩。与零奇异值对应的右奇异向量生成矩阵
的零空间,与非零奇异值对应的左奇异向量则生成矩阵
的列空间。
在线性代数数值计算中奇异值分解一般用于确定矩阵的有效秩,这是因为,由于舍入误差,秩亏矩阵的零奇异值可能会表现为很接近零的非零值。
矩阵近似值[编辑]
奇异值分解在统计中的主要应用为主成分分析(PCA)。
数据集的特征值(在SVD中用奇异值表征)按照重要性排列,降维的过程就是舍弃不重要的特征向量的过程,而剩下的特征向量张成空间为降维后的空间。
几种编程语言中计算SVD的函式范例[编辑]
matlab:
[b c d]=svd(x)
OpenCV:
void cvSVD( CvArr* A, CvArr* W, CvArr* U=NULL, CvArr* V=NULL, int
flags=0 )
历史[编辑]
参见[编辑]
外部链接[编辑]
LAPACK users manual gives details of
subroutines to calculate the SVD (see also
Applications of SVD on PC Hansen's web
site.
Introduction to the Singular Value
Decomposition by Todd Will of the University
of Wisconsin--La Crosse.
Los Alamos group's book chapter has helpful
gene data analysis examples.
MIT Lecture series by Gilbert Strang. See
Lecture #29 on the SVD.
Java SVD library routine.
Java applet demonstrating the SVD.
Java script demonstrating the SVD more
extensively, paste your data from a spreadsheet.
Chapter from "Numerical Recipes in C" gives
more information about implementation and applications of SVD.
Online Matrix Calculator Performs singular
value decomposition of matrices.