矩阵的奇异值分解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或者inflapack_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]])