矩阵的奇异值分解svd

矩阵的奇异值分解: 设矩阵 AA 为 阶的矩阵,则存在一个分解,使得:A=UΣVT\mathbf{A}=\mathbf{U} \mathbf{\Sigma} \mathbf{V}^{T} ,其中UUMMM*M 阶酉矩阵; Σ\Sigma为半正定的 阶的对焦矩阵; 而VVNNN*N 阶酉矩阵。

Σ\Sigma 对角线上的元素为 AA 的奇异值,通常按照从大到小排列。

scipy.linalg.svd(a, 
                 full_matrices=True, 
                 compute_uv=True, 
                 overwrite_a=False,  
                 check_finite=True, 
                 lapack_driver='gesdd')
  • a:一个矩阵,形状为(M,N),待分解的矩阵。
  • full_matrices:如果为True,则 UU 的形状为(M,M)VT\mathbf{V}^{T} 的形状为(N,N);否则 U\mathbf{U} 的形状为(M,K)VT\mathbf{V}^{T} 的形状为(K,N),其中 K=min(M,N)
  • compute_uv:如果True,则结果中额外返回U以及Vh;否则只返回奇异值
  • overwrite_a:一个布尔值,指定是否将结果写到a的存储区。
  • overwrite_b:一个布尔值,指定是否将结果写到b的存储区。
  • check_finite:如果为True,则检测输入中是否有nan或者inf
  • lapack_driver:一个字符串,指定求解算法。可以为:'gesdd'/'gesvd'。默认的'gesdd'

返回值:

  • UUU矩阵
  • s:奇异值,它是一个一维数组,按照降序排列。长度为 K=min(M,N)
  • Vh:就是 VT\mathbf{V}^{T} 矩阵

基本使用

奇异值分解; [011110] \left[\begin{array}{cccc} 0 & 1 \\ 1 & 1 \\ 1 & 0 \end{array}\right]

from scipy.linalg import svd

a = np.array([
    [0,1],
    [1,1],
    [1,0]
])
u,s,vt = svd(a)

结果:

# u
array([[-0.40824829,  0.70710678,  0.57735027],
       [-0.81649658,  0.        , -0.57735027],
       [-0.40824829, -0.70710678,  0.57735027]])

# s
array([1.73205081, 1.        ])

# vt
array([[-0.70710678, -0.70710678],
       [-0.70710678,  0.70710678]])

参考

Update time: 2020-07-05

results matching ""

    No results matching ""