矩阵的奇异值分解svd
矩阵的奇异值分解: 设矩阵 为 阶的矩阵,则存在一个分解,使得: ,其中 为 阶酉矩阵; 为半正定的 阶的对焦矩阵; 而 为 阶酉矩阵。
对角线上的元素为 的奇异值,通常按照从大到小排列。
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
,则 的形状为(M,M)
、 的形状为(N,N)
;否则 的形状为(M,K)
、 的形状为(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'
。
返回值:
U
: 矩阵s
:奇异值,它是一个一维数组,按照降序排列。长度为K=min(M,N)
Vh
:就是 矩阵
基本使用
奇异值分解;
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]])