scipy.linalg.
svd#
- scipy.linalg.svd(a, full_matrices=True, compute_uv=True, overwrite_a=False, check_finite=True, lapack_driver='gesdd')[source]#
奇異值分解。
將矩陣 a 分解為兩個么正矩陣
U
和Vh
,以及一個由奇異值(實數、非負數)組成的一維陣列s
,使得a == U @ S @ Vh
,其中S
是一個適當形狀的零矩陣,其主對角線為s
。- 參數:
- a(M, N) array_like
要分解的矩陣。
- full_matricesbool, optional
如果為 True(預設值),則 U 和 Vh 的形狀為
(M, M)
、(N, N)
。如果為 False,則形狀為(M, K)
和(K, N)
,其中K = min(M, N)
。- compute_uvbool, optional
是否除了
s
之外,還計算U
和Vh
。預設值為 True。- overwrite_abool, optional
是否覆寫 a;可能會提高效能。預設值為 False。
- check_finitebool, optional
是否檢查輸入矩陣是否僅包含有限數字。停用可能會提高效能,但如果輸入確實包含無限大或 NaN,則可能會導致問題(崩潰、非終止)。
- lapack_driver{‘gesdd’, ‘gesvd’}, optional
是否使用更有效率的分而治之方法(
'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