《统计学习方法》啃书手册|第15章 奇异值分解(教材全解 + 公式推导 + Python实现)

本文深入探讨了奇异值分解(SVD)的概念,包括定义、性质及计算方法。通过Python实现展示了如何进行紧奇异值分解,并解释了奇异值在矩阵近似中的作用,特别是弗罗贝尼乌斯范数下的最优近似。此外,还讨论了SVD在矩阵秩一近似和矩阵近似误差分析中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【学习建议】建议在学习第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 ∣∣AXF最小。

【补充解释】式(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}} ∣∣AXF=(σ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Λ]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值