SVD奇异分解
SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵。假设我们的矩阵A是一个m×n的矩阵,那么我们定义矩阵A的SVD为:
A=UΣVT
其中U是一个m×m的矩阵,Σ是一个m×n除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,V是一个n×n的矩阵。U和V都是酉矩阵,即满足
UTU=I,VTV=I

SVD分解步骤:
求ATA(大小为n×n)的特征值和特征向量:
(ATA)vi=λivi
所有特征向量组成矩阵V
,V中的每个特征向量叫做A的右奇异向量。
求AAT(大小为m×m)的特征值和特征向量:
(AAT)ui=λiui
所有特征向量组成矩阵U
,U中的每个特征向量叫做A的左奇异向量。
A=UΣVT⇒AV=UΣVTV⇒AV=UΣ⇒Avi=σiui⇒σi=Avi/ui
进一步我们还可以看出我们的特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:
A=UΣVT⇒AT=VΣUT⇒ATA=VΣUTUΣVT=VΣ2VT
由此可以看出
σi=λi
可从此计算奇异值
举例
A=⎝⎜⎛011110⎠⎟⎞
首先求出ATA和AAT:
ATA=(011110)⎝⎜⎛011110⎠⎟⎞=(2112)AAT=⎝⎜⎛011110⎠⎟⎞(011110)=⎝⎜⎛110121011⎠⎟⎞
进而求出ATA的特征值和特征向量:
λ1=3;v1=(1/21/2);λ2=1;v2=(−1/21/2)
接着求出AAT的特征值和特征向量:
λ1=3;u1=⎝⎜⎛1/62/61/6⎠⎟⎞;λ2=1;u2=⎝⎜⎛1/20−1/2⎠⎟⎞;λ3=0;u3=⎝⎜⎛1/3−1/31/3⎠⎟⎞
利用Avi=σiui,i=1,2求奇异值:
⎝⎜⎛011110⎠⎟⎞(1/21/2)=σ1⎝⎜⎛1/62/61/6⎠⎟⎞⇒σ1=3⎝⎜⎛011110⎠⎟⎞(−1/21/2)=σ2⎝⎜⎛1/20−1/2⎠⎟⎞⇒σ2=1
也可以用σi=λi直接求出奇异值为3和1,最终得到A的奇异值分解为:
A=UΣVT=⎝⎜⎛1/62/61/61/20−1/21/3−1/31/3⎠⎟⎞⎝⎜⎛300010⎠⎟⎞(1/2−1/21/21/2)
python和matlab都有内置的函数。