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
,以及一维阵列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布尔值,可选
是否还要计算
U
和Vh
除了……之外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
如果奇异值分解计算不收敛。
示例
>>> 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