奇异值分解简介
A=UΣVT
此处,U=(uij)m×m,Σ=(σij)m×n,VT=(vij)n×n,其中方阵U和V都是实正交矩阵(orthogonal matrix),也就是说,UT=U−1,VT=V−1, Σ是类对角矩阵,如下
Σ=[σ1000⋯00⋱0⋮⋯000σr0⋯00⋯00⋯0⋮⋱⋮⋮⋱⋮0⋯00⋯0]
主对角元σi>0,i=1,2,…,r,且σr+1=⋯σp=0,p=min{m,n},称为奇异值(singular values)。注意,SVD的分解不具有唯一性。为了便于应用,我们习惯将奇异值由大到小排列:σ1≥σ2≥⋯≥σr>0。
令矩阵U的行向量分别为ui,i=1,…,m,矩阵V的行向量分别为vj,j=1,…,n, 则A=UΣVT可以表示为r个秩-1(rank-one)矩阵之和:
A=[u1u2⋯um][σ1σ2⋱σr⋱][vT1vT2⋮vTn]=[σ1u1σ2u2⋯σrur0⋯0][vT1 vT2 ⋮ vTn]=σ1u1vT1+σ2u2vT2+⋯+σrurvTr
这个式子说明了原矩阵A仅由U的前r个行向量,VT的前r个列向量,以及Σ左上r×r分块矩阵决定。其称为瘦奇异值分解:
这进一步说明了,如果使用瘦奇异值分解的形式来储存矩阵的话可以节省大量的储存空间。
另外从线性变换的角度来理解奇异值分解的话,我们可以有如下理解:
我们可以将奇异值分解看作是矩阵A的三个分解步骤:旋转VT,伸缩Σ,再旋转U,图中表示的是2阶矩阵的分解变换。而另一方面,Σ也可以视作为变换矩阵A参考了基底{v1,…,vn}和{u1,…,um}的主对角变换矩阵。
其实在具体的奇异值分解的计算中我们主要利用了以下几个性质:
ATA和AAT的非零特征值为σ2i,i=1,2,…,r,r=rankA。需要注意的是,ATA和AAT是半正定矩阵(positive semidefinite),其特征值必定不是负数。
ATA的单位特征向量为vj,
ATAvj=σ2jvj,j=1,2,…,nAAT的单位特征向量为uj,
AATuj=σ2juj,j=1,2,…,m对于j=1,2,…,r,uj与vj具有以下关系:
Avj=σjujATuj=σjvj
对应奇异值σj,uj称为左奇异向量vj称为右奇异向量。
奇异值分解与特征值分解的关系
奇异值分解能够用于任意m×n矩阵,而特征分解只能适用于特定类型的方阵,故奇异值分解的适用范围更广。不过这两个分解之间是有联系的。给定一个矩阵M的奇异值分解,我们可以有
M⋆M=VΣ⋆U⋆UΣV⋆=V(Σ⋆Σ)V⋆MM⋆=UΣV⋆VΣ⋆U⋆=U(ΣΣ⋆)U⋆
由上式可知:
- 矩阵V的列向量(右奇异向量)是方阵M⋆M的特征向量
- 矩阵U的列向量(右奇异向量)是方阵MM⋆的特征向量
- Σ的非零对角元素(非零奇异值)是M⋆M或者MM⋆的非零特征值的平方根。
计算
下面举一个简单的例子来说明奇异值分解的计算程序,考虑如下矩阵:
A=[10002003000000004000]
STEP1:计算矩阵与自身转置相乘:
ATA=[10002016000009000000020004]
STPE2:求ATA的特征值与对应的特征向量,将特征值从大到小排列:
λ1=16,λ2=9,λ3=5,λ4=0,λ5=0
对应的单位特征向量依次为:
v1=[01000],v2=[00100],v3=[√0.2000√0.8],v4=[00010],v5=[−√0.8000√0.2]
则由上面的几个性质可知,非零奇异值为σ1=√λ1=4,σ2=√λ2=3,σ3=√λ3=√5
STEP3:设定Σ和V:
Σ=[400000300000√50000000]
V=[00√0.20−√0.810000010000001000√0.80√0.2]
STEP4:最后计算矩阵U。对于j=1,2,…,r,此例中r=3。可以直接计算uj=1σjAvj,结果如下:
u1=[0001],u2=[0100],u3=[1000]
根据施密特(Gram-Schmidt)正交化程序求出:
u4=[0010]
合并上面的结果,
U=[0010010000011000]
参考资料
- 奇异值分解, https://ccjou.wordpress.com/2009/09/01/奇異值分解-svd/
- Gene H. Golub, Michacel W. Mahoney, Petros Drineas, and Lek-Heng Lim, Bridging the Gap Between Numerical Linear Algebra, Theoretical Computer Science, and Data Applications, SIAM News, Vol. 39, No. 8, 2006.
- Wikipedia,https://zh.wikipedia.org/wiki/奇异值分解