转载出处http://blog.csdn.net/zhongkejingwang/article/details/43053513
网上关于矩阵和映射之间的对应关系的文章较少。A Singularly Valuable Decomposition The SVD of a Matrix,把矩阵和空间关系对应了起来。本文就参考了该文并结合矩阵的相关知识把SVD原理梳理一下。
SVD不仅是一个数学问题,在工程应用中的很多地方都有它的身影,比如PCA,掌握了SVD原理后再去看PCA那是相当简单的,在推荐系统方面,SVD更是名声大噪,将它应用于推荐系统的是Netflix大奖的获得者Koren,可以在Google上找到他写的文章;用SVD可以很容易得到任意矩阵的满秩分解,用满秩分解可以对数据做压缩。可以用SVD来证明对任意M*N的矩阵均存在如下分解:
这个可以应用在数据降维压缩上!在数据相关性特别大的情况下存储X和Y矩阵比存储A矩阵占用空间更小!
在开始讲解SVD之前,先补充一点矩阵代数的相关知识。
正交矩阵是在欧几里得空间里的叫法,在酉空间里叫酉矩阵,一个正交矩阵对应的变换叫正交变换,这个变换的特点是不改变向量的尺寸和向量间的夹角,那么它到底是个什么样的变换呢?看下面这张图
假设二维空间中的一个向量OA,它在标准坐标系也即e1、e2表示的坐标是中表示为(a,b)’(用’表示转置)。现在把它用另一组坐标e1’、e2’表示为(a’,b’)’,存在矩阵U使得(a’,b’)’=U(a,b)’,则U即为正交矩阵。从图中可以看到,正交变换只是将变换向量用另一组正交基表示,在这个过程中并没有对向量做拉伸,也不改变向量的空间位置。若对两个向量同时做正交变换,那么变换前后这两个向量的夹角显然不会改变。上面的例子只是正交变换的一个方面,即旋转变换,可以把e1’、e2’坐标系看做是e1、e2坐标系经过旋转某个 θ \theta θ得到,怎么样得到该旋转矩阵U呢?如下
x ⃗ = [ a b ] \vec{x}=\begin{bmatrix} a \\ b \\ \end{bmatrix} x=[ab] a ′ = x ⃗ ⋅ e 1 ′ ⃗ = e 1 ′ T ⃗ x ⃗ b ′ = x ⃗ ⋅ e 2 ′ ⃗ = e 2 ′ T ⃗ x ⃗ \begin{array}{l} a^{\prime}=\vec{x }\cdot \vec{e 1^{\prime}}=\vec{e1^{\prime^T}} \vec{x} \\ b^{\prime}=\vec{x} \cdot \vec{e 2^{\prime}}=\vec{e 2^{\prime^T}}\vec{ x} \end{array} a′=x⋅e1′=e1′Txb′=x⋅e2′=e2′Tx
a'和b'实际上是x在e1'和e2'轴上的投影大小,所以直接做内积可得:
[ a ′ b ′ ] = [ e 1 ′ T ⃗ e 2 ′ T ⃗ ] x ⃗ \begin{bmatrix} a^{\prime} \\ b^{\prime} \\ \end{bmatrix}=\begin{bmatrix} \vec{e1^{\prime^T}} \\ \vec{e2^{\prime^T}} \\ \end{bmatrix}\vec{x} [a′b′]=[e1′Te2′T]x
从图中可以看到
e 1 ′ ⃗ = [ c o s θ s i n θ ] , e 2 ′ ⃗ = [ − s i n θ c o s θ ] \vec{e 1^{\prime}}=\begin{bmatrix} cos\theta \\ sin\theta \\ \end{bmatrix} ,\vec{e 2^{\prime}}=\begin{bmatrix} -sin\theta \\ cos\theta \\ \end{bmatrix} e1′=[cosθsinθ],e2′=[−sinθcosθ]
所以
U = [ c o s θ s i n θ − s i n θ c o s θ ] \textbf{U}=\begin{bmatrix} cos\theta&sin\theta \\ -sin\theta&cos\theta \\ \end{bmatrix} U=[cosθ−sinθsinθcosθ]
正交阵U行(列)向量之间都是单位正交向量。上面求得的是一个旋转矩阵,它对向量做旋转变换!也许你会有疑问:刚才不是说向量空间位置不变吗?怎么现在又说它被旋转了?对的,这两个并没有冲突,说空间位置不变是绝对的,但是坐标是相对的,加入你站在e1上看OA,随着e1旋转到e1',看OA的位置就会改变。如下图:
如图,如果我选择了e1'、e2'作为新的标准坐标系,那么在新坐标系中OA(原标准坐标系的表示)就变成了OA',这样看来就好像坐标系不动,把OA往顺时针方向旋转了“斯塔”角度,这个操作实现起来很简单:将变换后的向量坐标仍然表示在当前坐标系中。
旋转变换是正交变换的一个方面,这个挺有用的,比如在开发中需要实现某种旋转效果,直接可以用旋转变换实现。正交变换的另一个方面是反射变换,也即e1'的方向与图中方向相反,这个不再讨论。
总结:正交矩阵的行(列)向量都是两两正交的单位向量,正交矩阵对应的变换为正交变换,它有两种表现:旋转和反射。正交矩阵将标准正交基映射为标准正交基(即图中从e1、e2到e1'、e2')
λ i \lambda_i λi
对应的单位特征向量为
x i ⃗ \vec{x_i} xi
则有
A x 1 ⃗ = λ 1 x 1 ⃗ A x 2 ⃗ = λ 2 x 2 ⃗ … A x m ⃗ = λ m x m ⃗ \begin{aligned} A \vec{x_{1}} &=\lambda_{1} \vec{x_{1}} \\ A \vec{x_{2}} &=\lambda_{2} \vec{x_{2}} \\ & \ldots \\ A \vec{x_{m} }&=\lambda_{m} \vec{x_{m}} \end{aligned} Ax1Ax2Axm=λ1x1=λ2x2…=λmxm
进而
A U = U Λ \bm{A U=U \Lambda} AU=UΛ U = [ x 1 x 2 ⋯ x m ] \bm{U=\left[\begin{array}{ccc} \pmb{x_{1}} & \pmb{x_{2}} & \cdots & \pmb{x_{m}} \end{array}\right] } U=[x1x1x1x2x2x2⋯xmxmxm]
Λ = [ λ 1 ⋯ 0 ⋮ ⋱ ⋮ 0 ⋯ λ m ] \bm{\Lambda=\left[\begin{array}{ccc} \lambda_{1} & \cdots & 0 \\ \vdots & \ddots & \vdots \\ 0 & \cdots & \lambda_{m} \end{array}\right] } Λ=⎣⎢⎡λ1⋮0⋯⋱⋯0⋮λm⎦⎥⎤
所以可得到A的特征值分解(由于对称阵特征向量两两正交,所以U为正交阵,正交阵的逆矩阵等于其转置)
A = U Λ U − 1 = U Λ U T \bm{A=U \Lambda U^{-1}=U \Lambda U^{T}} A=UΛU−1=UΛUT
这里假设A有m个不同的特征值,实际上,只要A是对称阵其均有如上分解。
矩阵A分解了,相应的,其对应的映射也分解为三个映射。现在假设有x向量,用A将其变换到A的列空间中,那么首先由U'先对x做变换:
A x = U Λ U T x \bm{Ax=U \Lambda U^{T}x} Ax=UΛUTx
U是正交阵U'也是正交阵,所以U'对x的变换是正交变换,它将x用新的坐标系来表示,这个坐标系就是A的所有正交的特征向量构成的坐标系。比如将x用A的所有特征向量表示为:(这里把箭头形式的向量用粗体表示)
x = a 1 x 1 + a 2 x 2 + ⋯ + a m x m \pmb{x}=a_{1}\pmb{ x_{1}}+a_{2}\pmb{ x_{2}}+\cdots+a_{m} \pmb{x_{m}} xxx=a1x1x1x1+a2x2x2x2+⋯+amxmxmxm
则通过第一个变换就可以把x表示为[a1 a2 ... am]':(a1、a2等是标量)
U Λ U T x = U Λ [ x 1 T x 2 T ⋮ x m T ] ( a 1 x 1 + a 2 x 2 + ⋯ + a m x m ) = U Λ [ a 1 a 2 ⋮ a m ] \bm{U \Lambda U^{T} x=U \Lambda\left[\begin{array}{c} \pmb{x_{1}^{T}} \\ \pmb{x_{2}^{T} }\\ \vdots \\ \pmb{x_{m}^{T}} \end{array}\right]}\left(a_{1}\pmb{ x_{1}}+a_{2} \pmb{x_{2}}+\cdots+a_{m} \pmb{x_{m}}\right)=\pmb{U} \pmb{\Lambda}\left[\begin{array}{c} a_{1} \\ a_{2} \\ \vdots \\ a_{m} \end{array}\right] UΛUTx=UΛ⎣⎢⎢⎢⎡x1Tx1Tx1Tx2Tx2Tx2T⋮xmTxmTxmT⎦⎥⎥⎥⎤(a1x1x1x1+a2x2x2x2+⋯+amxmxmxm)=UUUΛΛΛ⎣⎢⎢⎢⎡a1a2⋮am⎦⎥⎥⎥⎤
紧接着,在新的坐标系表示下,由中间那个对角矩阵对新的向量坐标换,其结果就是将向量往各个轴方向拉伸或压缩:
U Λ [ a 1 a 2 ⋮ a m ] = U [ λ 1 ⋯ 0 ⋮ ⋱ ⋮ 0 ⋯ λ m ] [ a 1 a 2 ⋮ a m ] = U [ λ 1 a 1 λ 2 a 2 ⋮ λ m a m ] \bm{U \Lambda\left[\begin{array}{c} a_{1} \\ a_{2} \\ \vdots \\ a_{m} \end{array}\right]=U\left[\begin{array}{ccc} \lambda_{1} & \cdots & 0 \\ \vdots & \ddots & \vdots \\ 0 & \cdots & \lambda_{m} \end{array}\right]\left[\begin{array}{c} a_{1} \\ a_{2} \\ \vdots \\ a_{m} \end{array}\right]=U\left[\begin{array}{c} \lambda_{1} a_{1} \\ \lambda_{2} a_{2} \\ \vdots \\ \lambda_{m} a_{m} \end{array}\right]} UΛ⎣⎢⎢⎢⎡a1a2⋮am⎦⎥⎥⎥⎤=U⎣⎢⎡λ1⋮0⋯⋱⋯0⋮λm⎦⎥⎤⎣⎢⎢⎢⎡a1a2⋮am⎦⎥⎥⎥⎤=U⎣⎢⎢⎢⎡λ1a1λ2a2⋮λmam⎦⎥⎥⎥⎤
从上图可以看到,如果A不是满秩的话,那么就是说对角阵的对角线上元素存在0,这时候就会导致维度退化,这样就会使映射后的向量落入m维空间的子空间中。
最后一个变换就是U对拉伸或压缩后的向量做变换,由于U和U'是互为逆矩阵,所以U变换是U'变换的逆变换。
因此,从对称阵的分解对应的映射分解来分析一个矩阵的变换特点是非常直观的。假设对称阵特征值全为1那么显然它就是单位阵,如果对称阵的特征值有个别是0其他全是1,那么它就是一个正交投影矩阵,它将m维向量投影到它的列空间中。
根据对称阵A的特征向量,如果A是2*2的,那么就可以在二维平面中找到这样一个矩形,是的这个矩形经过A变换后还是矩形:
这个矩形的选择就是让其边都落在A的特征向量方向上,如果选择其他矩形的话变换后的图形就不是矩形了!
上面的特征值分解的A矩阵是对称阵,根据EVD可以找到一个(超)矩形使得变换后还是(超)矩形,也即A可以将一组正交基映射到另一组正交基!那么现在来分析:对任意M*N的矩阵,能否找到一组正交基使得经过它变换后还是正交基?答案是肯定的,它就是SVD分解的精髓所在。
现在假设存在M*N矩阵A,事实上,A矩阵将n维空间中的向量映射到k(k<=m)维空间中,k=Rank(A)。现在的目标就是:在n维空间中找一组正交基,使得经过A变换后还是正交的。假设已经找到这样一组正交基:
{ v 1 , v 2 , … , v n } \bm{\left\{v_{1}, v_{2}, \dots, v_{n}\right\}} {v1,v2,…,vn}
则A矩阵将这组基映射为:
{ A v 1 , A v 2 , … , A v n } \bm{\left\{A v_{1}, A v_{2}, \dots, A v_{n}\right\}} {Av1,Av2,…,Avn}
如果要使他们两两正交,即
A v i ⋅ A v j = ( A v i ) T A v j = v i T A T A v j = 0 \bm{\mathrm{A} v_{i} \cdot A v_{j}=\left(\mathrm{A} v_{i}\right)^{T} A v_{j}=v_{i}^{T} A^{T} \mathrm{A} v_{j}=0} Avi⋅Avj=(Avi)TAvj=viTATAvj=0
根据假设,存在
v i T v j = v i ⋅ v j = 0 \bm{v_i^Tv_j=v_i\cdot v_j=0} viTvj=vi⋅vj=0
所以如果正交基v选择为A'A的特征向量的话,由于A'A是对称阵,v之间两两正交,那么
v i T A T A v j = v i T λ j v j = λ j v i T v j = λ j v i ⋅ v j = 0 \bm{v_{i}^{T} A^{T}Av_j=v_{i}^{T}}\lambda_j\pmb{v_j}=\lambda_{j} \pmb{v_{i}^{T}}\pmb{ v_{j}}=\lambda_{j}\pmb{ v_{i}}\cdot \pmb{v_{j}}=0 viTATAvj=viTλjvjvjvj=λjviTviTviTvjvjvj=λjvivivi⋅vjvjvj=0
这样就找到了正交基使其映射后还是正交基了,现在,将映射后的正交基单位化:
因为
A v i ⋅ A v i = λ i v i ⋅ v i = λ i \bm{A v_{i} \cdot A v_{i}=}\lambda_i\pmb{v_i}\cdot \pmb{v_i}=\lambda_i Avi⋅Avi=λivivivi⋅vivivi=λi
所以有
∣ A v i ∣ 2 = λ i ≥ 0 \bm{\left|A v_{i}\right|^{2}}=\lambda_{i} \geq 0 ∣Avi∣2=λi≥0
所以取单位向量
u i = A v i ∣ A v i ∣ = 1 λ i A v i \bm{u_{i}=\frac{A v_{i}}{\left|A v_{i}\right|}}=\frac{1}{\sqrt{\lambda_{i}}} \bm{A v_{i}} ui=∣Avi∣Avi=λi1Avi
由此可得
当k < i <= m时,对u1,u2,...,uk进行扩展u(k+1),...,um,使得u1,u2,...,um为m维空间中的一组正交基,即
同样的,对v1,v2,...,vk进行扩展v(k+1),...,vn(这n-k个向量存在于A的零空间中,即Ax=0的解空间的基),使得v1,v2,...,vn为n维空间中的一组正交基,即
则可得到
继而可以得到A矩阵的奇异值分解:
现在可以来对A矩阵的映射过程进行分析了:如果在n维空间中找到一个(超)矩形,其边都落在A'A的特征向量的方向上,那么经过A变换后的形状仍然为(超)矩形!
vi为A'A的特征向量,称为A的右奇异向量,ui=Avi实际上为AA'的特征向量,称为A的左奇异向量。下面利用SVD证明文章一开始的满秩分解:
利用矩阵分块乘法展开得:
可以看到第二项为0,有
令
则A=XY即是A的满秩分解。
整个SVD的推导过程就是这样,后面会介绍SVD在推荐系统中的具体应用,也就是复现Koren论文中的算法以及其推导过程。
参考文献:A Singularly Valuable Decomposition The SVD of a Matrix