【学习建议】建议在学习第15章前先学习附录D。
15.1.1 定义与定理
【补充解释】 U U T = I U U^T = I UUT=I,其中 I I I是单位矩阵,这个条件是正交矩阵的定义,即要求 U U U是正交矩阵。 V V T = I V V^T = I VVT=I同理。
【勘误补充】P. 274 倒数第4行的“表”应写作“表示”。
定理15.1的证明
证明思路:设实矩阵 A A A的奇异值分解为 A = U Σ V T A = U \Sigma V^T A=UΣVT,则有 A T A = ( U Σ V T ) T ( U Σ V T ) = V ( Σ T Σ ) V T A^T A = (U \Sigma V^T)^T (U \Sigma V^T) = V (\Sigma^T \Sigma) V^T ATA=(UΣVT)T(UΣVT)=V(ΣTΣ)VT。因为 Σ \Sigma Σ是对角矩阵,则有 Σ T Σ \Sigma^T \Sigma ΣTΣ也是对角矩阵,上式即实对称矩阵 A T A A^T A ATA的对角化。显然, V V V和 Σ T Σ \Sigma^T \Sigma ΣTΣ都是可求的;而得到 V V V和 Σ T Σ \Sigma^T \Sigma ΣTΣ后, U U U也是可求的。于是,按以上过程求解并找出满足奇异值分解的条件的 V V V、 Σ T Σ \Sigma^T \Sigma ΣTΣ和 U U U即可。
具体证明详解:定理15.1(奇异值分解基本定理)证明详解
15.1.4 主要性质
【补充说明】式(15.20)也正是书中证明奇异值基本定理的思路。
15.2 奇异值分解的计算
紧奇异值分解(原生Python实现)
import numpy as np
def csvd(A):
"""计算A的紧奇异值分解
:param A: 目标矩阵
:return:
m×r阶矩阵(完全奇异值分解的前r列)
r阶对角矩阵(完全奇异值分解的前r个对角线元素)
n×r阶矩阵的转置(完全奇异值分解的前r行)
"""
# 计算对称矩阵 W = A^T*A
W = np.dot(A.T, A)
# 求解矩阵的特征值和特征向量:返回的特征值是升序的、特征向量已经被单位化
# (因为已知W是对称矩阵,所以使用eigh而不是eig)
l, V = np.linalg.eigh(W)
# 计算特征值的平方根并由大到小排列
l = np.sqrt(l[::-1])
# ---------- 2.求r×r的对角矩阵S的剪辑后结果 ----------
# 构造r×r的对角矩阵S
S = np.diag([v for v in l if v > 0])
# 计算矩阵的秩
r = S.shape[0]
# ---------- 3.求n阶正交矩阵V的剪辑后结果 ----------
# * 因为特征向量对应的特征值已经升序,所以直接翻转即可
# * 特征向量已经被单位化
V = V[:, -1:-1 - r:-1]
# ---------- 4.求m阶正交矩阵U的剪辑后结果 ----------
U = np.hstack([(np.dot(A, V[:, i]) / l[i])[:, np.newaxis] for i in range(r)])
return U, S, V.T
【测试】例15.5(矩阵的秩为1)
if __name__ == "__main__":
A = np.array([[1, 1],
[2, 2],
[0, 0]])
U, S, VT = csvd(A)
print(U)
# [[0.4472136 ]
# [0.89442719]
# [0. ]]
print(S)
# [[3.16227766]]
print(VT)
# [[0.70710678 0.70710678]]
奇异值分解(numpy实现)
【测试】例子15.5
import numpy as np
if __name__ == "__main__":
A = np.array([[1, 1],
[2, 2],
[0, 0]])
U, S, VT = np.linalg.svd(A)
print(U)
# [[-0.4472136 -0.89442719 0. ]
# [-0.89442719 0.4472136 0. ]
# [ 0. 0. 1. ]]
print(S)
# [3.16227766e+00 1.57009246e-16]
print(VT)
# [[-0.70710678 -0.70710678]
# [-0.70710678 0.70710678]]
15.3 奇异值分解的矩阵近似
【补充说明】在式(15.27)的推导中,需要注意到正交矩阵乘以一个向量的几何意义就是对这个向量的旋转或反射变换,而不改变向量的模长。
【补充解释】定理15.2的理解:弗罗贝尼乌斯范数意义下的最优近似,寻找秩不大于 k k k的矩阵 X X X,使 X X X尽可能地接近矩阵 A A A,即使得残差 ∣ ∣ A − X ∣ ∣ F ||A-X||_F ∣∣A−X∣∣F最小。
【补充解释】式(15.36)的推导用到了式(15.27)和式(15.28)。
【阅读建议】在阅读定理15.3时,建议将
A
A
A和
X
X
X写出以帮助理解:
A
=
Q
[
B
11
B
12
B
21
B
22
]
P
T
,
X
=
Q
[
Ω
k
0
0
0
]
P
T
A = Q \begin{bmatrix} B_{11} & B_{12} \\ B_{21} & B_{22} \end{bmatrix} P^T, \hspace{2em} X = Q \begin{bmatrix} \Omega_k & 0 \\ 0 & 0 \end{bmatrix} P^T
A=Q[B11B21B12B22]PT,X=Q[Ωk000]PT
【补充解释】之所以在证明
B
12
=
0
B_{12}=0
B12=0和
B
21
=
0
B_{21}=0
B21=0时,需注意用于替代
X
X
X的
Y
Y
Y的秩不能大于
k
k
k。
定理15.3的简单理解
若矩阵 X X X为矩阵 A A A在弗罗贝尼乌斯范数意义下的最优近似,则有:
- 矩阵 U Σ ′ V T U \Sigma' V^T UΣ′VT是达到最优值的一个矩阵( Σ ′ \Sigma' Σ′同书中定义);
- 残差 ∣ ∣ A − X ∣ ∣ F = ( σ k + 1 2 + σ k + 2 2 + ⋯ + σ n 2 ) 1 2 ||A-X||_F = (\sigma_{k+1}^2+\sigma_{k+2}^2+\cdots+\sigma_n^2)^{\frac{1}{2}} ∣∣A−X∣∣F=(σk+12+σk+22+⋯+σn2)21。
式15.42的推导
U 2 T ( Q T A P ) V 2 = U 2 T B V 2 = [ I k 0 0 U 1 T ] [ Ω k 0 0 B 22 ] [ I k 0 0 V 1 ] = [ Ω k 0 0 U 1 T B 22 V 1 ] \begin{aligned} U_2^T (Q^T A P) V_2 & = U_2^T B V_2 \\ & = \begin{bmatrix} I_k & 0 \\ 0 & U_1^T \end{bmatrix} \begin{bmatrix} \Omega_k & 0 \\ 0 & B_{22} \end{bmatrix} \begin{bmatrix} I_k & 0 \\ 0 & V_1 \end{bmatrix} \\ & = \begin{bmatrix} \Omega_k & 0 \\ 0 & U_1^T B_{22} V_1 \end{bmatrix} \end{aligned} U2T(QTAP)V2=U2TBV2=[Ik00U1T][Ωk00B22][Ik00V1]=[Ωk00U1TB22V1]
因为
B
22
=
U
1
Λ
V
1
T
B_{22} = U_1 \Lambda V_1^T
B22=U1ΛV1T,所以有
U
1
T
B
22
V
1
=
Λ
U_1^T B_{22} V_1 = \Lambda
U1TB22V1=Λ。将其代入上式得
U
2
T
(
Q
T
A
P
)
V
2
=
[
Ω
k
0
0
Λ
]
U_2^T (Q^T A P) V_2 = \begin{bmatrix} \Omega_k & 0 \\ 0 & \Lambda \end{bmatrix}
U2T(QTAP)V2=[Ωk00Λ]