奇异值分解的计算过程
我们知道奇异值分解的表达式为:
A
=
U
Σ
V
T
A=U\Sigma V^{\mathrm{T}}
A=UΣVT那如何求解
U
U
U、
Σ
\Sigma
Σ和
V
V
V这三个矩阵呢?
- 计算 A T A A^{T}A ATA的特征值,通过得到的特征值进一步计算得到A矩阵的奇异值;
- 通过计算得到的奇异值,构造与A矩阵维数相同的矩阵 Σ \Sigma Σ;
- 计算 A T A A^{T}A ATA对应的单位特征向量并按照对应特征值从大到小的顺序构建 A T A A^{T}A ATA特征向量矩阵 V V V,也为A的右奇异矩阵;
- U U UA的左奇异矩阵为 A A T AA^{T} AAT所对应的单位特征向量矩阵。
证明: A T A A^{T}A ATA的特征值矩阵为奇异值矩阵的平方
证明:假设有 m ∗ n m*n m∗n的非方阵矩阵 A A A,对其进行奇异值分解的表达式为: A = U Σ V T A=U\Sigma V^{\mathrm{T}} A=UΣVT其中 U U U为 m ∗ m m*m m∗m矩阵, Σ \Sigma Σ为 m ∗ n m*n m∗n对角矩阵, V V V为 n ∗ n n*n n∗n矩阵。其中, U U U和 V V V为标准正交的酉矩阵(酉矩阵的定义为:令矩阵 U T U = E U^{\mathrm{T}}U=E UTU=E,又因为 U − 1 U = E U^{-1}U=E U−1U=E,有 U T = U − 1 U^{\mathrm{T}}=U^{-1} UT=U−1,即 U U U为酉矩阵。)。左奇异值 U U U和右奇异值 V V V求解公式见下篇SVD求解方法。
下面开始对问题进行证明:
A
=
U
Σ
V
T
A=U\Sigma V^{\mathrm{T}}
A=UΣVT
A
T
=
V
Σ
U
T
A^{\mathrm{T}}=V\Sigma U^{\mathrm{T}}
AT=VΣUT由于
Σ
\Sigma
Σ为对角矩阵,所以
Σ
T
=
Σ
\Sigma^{\mathrm{T}}=\Sigma
ΣT=Σ。
所以
A
T
A
=
V
Σ
U
T
U
Σ
V
T
A^{T}A=V\Sigma U^{\mathrm{T}}U\Sigma V^{\mathrm{T}}
ATA=VΣUTUΣVT
A
T
A
=
V
Σ
2
V
T
A^{T}A=V\Sigma^{2} V^{\mathrm{T}}
ATA=VΣ2VT因为
V
V
V为标准正交的酉矩阵,并且为
A
T
A
A^{T}A
ATA矩阵的特征向量矩阵,所以
V
Σ
2
V
T
V\Sigma^{2} V^{\mathrm{T}}
VΣ2VT便可以作为计算
A
T
A
A^{T}A
ATA的特征值的计算公式,所以在实数域内,
A
T
A
A^{T}A
ATA的特征值
Λ
\Lambda
Λ便为非方阵矩阵
A
A
A的奇异值矩阵的平方。
所以 Σ \Sigma Σ表现形式如下: Σ = [ Σ 1 0 0 0 ] \Sigma=\left[\begin{array}{cc} \Sigma_{1} & 0 \\ 0 & 0 \end{array}\right] Σ=[Σ1000] Σ 1 \Sigma_{1} Σ1同样为对角矩阵,具体为 Σ 1 = diag ( σ 1 , σ 2 , ⋯ , σ r ) , r = rank ( A ) \Sigma_{1}=\operatorname{diag}\left(\sigma_{1}, \sigma_{2}, \cdots, \sigma_{r}\right), r=\operatorname{rank}(A) Σ1=diag(σ1,σ2,⋯,σr),r=rank(A), σ 1 , σ 2 , ⋯ , σ r \sigma_{1}, \sigma_{2}, \cdots, \sigma_{r} σ1,σ2,⋯,σr为 A A A矩阵的奇异值( A H A A^{H}A AHA的特征值的开方,为什么是 A H A^{H} AH呢,因为 A H A^{H} AH是复数域中的 A T A^{T} AT),并且从大到小排列。
SVD Numpy实现过程
import numpy as np
U, S, Vt = np.linalg.svd(A, full_matrices=True)# A为待分解的矩阵