scipy.linalg.svd

scipy.linalg.svd(a, full_matrices=True, compute_uv=True, overwrite_a=False, check_finite=True, lapack_driver='gesdd')[源代码]

奇异值分解。

分解矩阵 a 转化为两个酉矩阵 UVh ,以及一维阵列 s 奇异值(实数,非负数)使得 a == U @ S @ Vh ,在哪里 S 是一个形状合适的具有主对角线的零矩阵。 s

参数
a(M,N)类数组

要分解的矩阵。

full_matrices布尔值,可选

如果为True(默认值), UVh 都是有形状的 (M, M)(N, N) 。如果为false,则形状为 (M, K)(K, N) ,在哪里 K = min(M, N)

compute_uv布尔值,可选

是否还要计算 UVh 除了……之外 s 。默认值为True。

overwrite_a布尔值,可选

是否覆盖 a ;可以提高性能。默认值为False。

check_finite布尔值,可选

是否检查输入矩阵是否仅包含有限个数字。禁用可能会带来性能提升,但如果输入确实包含无穷大或NAN,则可能会导致问题(崩溃、非终止)。

lapack_driver{‘gesdd’,‘gesvd’},可选

是否使用更有效的分而治之的方法 ('gesdd' )或一般矩形方法 ('gesvd' )来计算奇异值分解(SVD)。matlab和Octave使用 'gesvd' 进场。默认值为 'gesdd'

0.18 新版功能.

退货
Undarray

以左奇异向量为列的酉矩阵。形状的 (M, M)(M, K) ,取决于 full_matrices

sndarray

奇异值,按非递增顺序排序。形状(K,),带有 K = min(M, N)

Vhndarray

右奇异向量为行的酉矩阵。形状的 (N, N)(K, N) 取决于 full_matrices

compute_uv=False ,仅限 s 返回。
加薪
LinAlgError

如果奇异值分解计算不收敛。

参见

svdvals

计算矩阵的奇异值。

diagsvd

在给定向量s的情况下,构造Sigma矩阵。

示例

>>> from scipy import linalg
>>> from numpy.random import default_rng
>>> rng = default_rng()
>>> m, n = 9, 6
>>> a = rng.standard_normal((m, n)) + 1.j*rng.standard_normal((m, n))
>>> U, s, Vh = linalg.svd(a)
>>> U.shape,  s.shape, Vh.shape
((9, 9), (6,), (6, 6))

根据分解重建原始矩阵:

>>> sigma = np.zeros((m, n))
>>> for i in range(min(m, n)):
...     sigma[i, i] = s[i]
>>> a1 = np.dot(U, np.dot(sigma, Vh))
>>> np.allclose(a, a1)
True

或者,使用 full_matrices=False (请注意, U 是不是就这样 (m, n) 而不是 (m, m) ):

>>> U, s, Vh = linalg.svd(a, full_matrices=False)
>>> U.shape, s.shape, Vh.shape
((9, 6), (6,), (6, 6))
>>> S = np.diag(s)
>>> np.allclose(a, np.dot(U, np.dot(S, Vh)))
True
>>> s2 = linalg.svd(a, compute_uv=False)
>>> np.allclose(s, s2)
True