scipy.linalg.
svd#
- scipy.linalg.svd(a, full_matrices=True, compute_uv=True, overwrite_a=False, check_finite=True, lapack_driver='gesdd')[源码]#
奇异值分解。
将矩阵 a 分解为两个酉矩阵
U
和Vh
,以及一个包含奇异值(实数,非负)的 1-D 数组s
,使得a == U @ S @ Vh
,其中S
是一个形状适当的零矩阵,其主对角线为s
。本文档假定数组参数具有指定的“核心”形状。但是,此函数的数组参数可能在核心形状前附加额外的“批处理”维度。在这种情况下,数组被视为低维切片的批处理;有关详细信息,请参阅 批处理线性运算。
- 参数:
- a(M, N) 类数组对象
待分解的矩阵。
- full_matrices布尔值, 可选
如果为 True(默认),U 和 Vh 的形状分别为
(M, M)
和(N, N)
。如果为 False,形状分别为(M, K)
和(K, N)
,其中K = min(M, N)
。- compute_uv布尔值, 可选
除了
s
之外,是否也计算U
和Vh
。默认为 True。- overwrite_a布尔值, 可选
是否覆盖 a;可能会提高性能。默认为 False。
- check_finite布尔值, 可选
是否检查输入矩阵仅包含有限数。禁用此项可能会提高性能,但如果输入包含无穷大或 NaN,则可能导致问题(崩溃、无法终止)。
- lapack_driver{‘gesdd’, ‘gesvd’}, 可选
是使用更高效的分治法(
'gesdd'
)还是通用矩形法('gesvd'
)来计算 SVD。MATLAB 和 Octave 使用'gesvd'
方法。默认为'gesdd'
。
- 返回:
- 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
如果 SVD 计算不收敛。
示例
>>> import numpy as np >>> from scipy import linalg >>> rng = np.random.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