本文从理论基础的角度梳理对SVD的理解,不涉及SVD的实现算法。若有不准确的地方,请指正。转载请注明出处。
下面是两篇介绍SVD基础的非常不错的文章,本文的一些思路参考了它们:
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
http://www.ams.org/samplings/feature-column/fcarc-svd
一、方矩阵的特征值分解
对于一个
n
阶非奇异方矩阵
把所有这些特征向量组成一个
n
阶矩阵
则这
n
个特征方程
因为
n
个特征向量
这就是非奇异矩阵的特征值分解。也许写成分量的形式,更能体现出“分解”的含义,我们把 P 的逆矩阵写成行向量的形式 P−1=(q1,q2,…,qn)T ,行向量 qi 是矩阵 P−1 的低 i 行。这样,上面的方程可以写为:
这样,矩阵 A 被分解成了向量 pi 与 qTi 的乘积的和,对应的特征值 λi 是每一项的系数。对于矩阵 A 是对称矩阵的情况,其特征向量是正交的,所以 P 是正交矩阵,有 P−1=PT ,这样上式中的 qi=pi 。所以对称矩阵可以由它的特征向量来分解。
二、奇异值分解
非方阵没有特征值和特征向量,不存在上面那样的特征值分解,但是可以做类似的奇异值分解。
一个
m×n
阶矩阵
A
可以看做对空间的一种线性变换,
1. 奇异值与奇异向量
矩阵
ATA
是
n
阶的,记其
我们将这些特征向量取为单位长度,则它们可以当做原 n 维空间中的一组正交基,满足下面的正交归一关系:
将它们经过矩阵
A
变换后在
其中已经把
n
个向量
当 i≠j 时,上式等于0。当 i=j 时,因为 ui 是单位向量,所以上式等于1。这样我们同时得到:
可以看出,向量 ui 与 vi 具有相同的正交特性。
在方程 (???) 的两端同左乘 AT ,利用方程 (???) 容易得到下面的关系:
再在这个方程两端左乘
A
,结合方程
可以看出,矩阵
A
和
按照定义,
vi
是矩阵
A
的奇异向量,
2. 奇异值分解
根据前面的讨论,
m×n
矩阵
A
的作用空间是
结合上面的结果
(???)
,矩阵
A
对向量
因为向量 f 是任意的,从上面的结果可以得到
这就是矩阵的奇异值分解,把
A
分解成
从这个分解可以看出,那些奇异值较小的项,对矩阵
A
的贡献较小,在一定精度上可以省略掉。我们把
我们定义
m×r
阶矩阵
U
、
n×r
阶矩阵
V
和
这样矩阵 A 就可以写为三个矩阵相乘:
SVD算法的任务,就是计算出奇异值和两个矩阵 U 、 VT 。