本文簡要介紹 python 語言中 numpy.linalg.svd
的用法。
用法:
linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)
奇異值分解。
什麽時候a是一個二維數組,它被分解為
u @ np.diag(s) @ vh = (u * s) @ vh
,其中u和vh是二維酉陣列和s是一維數組a的奇異值。什麽時候a是更高維的,SVD 以堆疊模式應用,如下所述。- a: (…, M, N) 數組
帶有
a.ndim >= 2
的實數或複數數組。- full_matrices: 布爾型,可選
如果為真(默認),u和vh有形狀
(..., M, M)
和(..., N, N)
, 分別。否則,形狀為(..., M, K)
和(..., K, N)
,分別在哪裏K = min(M, N)
.- compute_uv: 布爾型,可選
除了 s 之外,是否計算 u 和 vh。默認為真。
- hermitian: 布爾型,可選
如果為 True,則假定 a 為 Hermitian(如果為實值,則為對稱),從而可以更有效地找到奇異值。默認為假。
- u: { (…, M, M), (…, M, K) } 數組
單一數組。首先
a.ndim - 2
尺寸與輸入尺寸相同a.最後兩個維度的大小取決於full_matrices.僅返回時compute_uv為真。- s: (…, K) 數組
具有奇異值的向量,在每個向量中按降序排序。首先
a.ndim - 2
尺寸與輸入尺寸相同a.- vh: { (…, N, N), (…, K, N) } 數組
單一數組。首先
a.ndim - 2
尺寸與輸入尺寸相同a.最後兩個維度的大小取決於full_matrices.僅返回時compute_uv為真。
- LinAlgError
如果 SVD 計算不收斂。
參數:
返回:
拋出:
注意:
使用 LAPACK 例程
_gesdd
執行分解。SVD 通常被說明為二維矩陣的分解
.下麵將討論高維情況。在二維情況下,SVD 寫為 ,其中 , , 和 .一維數組s包含的奇異值a和u和vh是單一的。的行vh是的特征向量 和列u是的特征向量 .在這兩種情況下,對應的(可能非零)特征值由下式給出s**2
.如果a具有兩個以上的維度,則適用廣播規則,如中所述一次在多個矩陣上進行線性代數.這意味著 SVD 在 “stacked” 模式下工作:它迭代第一個索引的所有索引
a.ndim - 2
尺寸和每個組合 SVD 應用於最後兩個索引。矩陣a可以從分解中重建(u * s[..., None, :]) @ vh
或者u @ (s[..., None] * vh)
. (這@
運算符可以替換為函數np.matmul
對於低於 3.5 的 python 版本。)如果a是一個
matrix
對象(相對於ndarray
),那麽所有的返回值也是如此。例子:
>>> a = np.random.randn(9, 6) + 1j*np.random.randn(9, 6) >>> b = np.random.randn(2, 7, 8, 3) + 1j*np.random.randn(2, 7, 8, 3)
基於全 SVD 的重構,2D 案例:
>>> u, s, vh = np.linalg.svd(a, full_matrices=True) >>> u.shape, s.shape, vh.shape ((9, 9), (6,), (6, 6)) >>> np.allclose(a, np.dot(u[:, :6] * s, vh)) True >>> smat = np.zeros((9, 6), dtype=complex) >>> smat[:6, :6] = np.diag(s) >>> np.allclose(a, np.dot(u, np.dot(smat, vh))) True
基於簡化 SVD 的重建,2D 案例:
>>> u, s, vh = np.linalg.svd(a, full_matrices=False) >>> u.shape, s.shape, vh.shape ((9, 6), (6,), (6, 6)) >>> np.allclose(a, np.dot(u * s, vh)) True >>> smat = np.diag(s) >>> np.allclose(a, np.dot(u, np.dot(smat, vh))) True
基於全SVD、4D案例的重構:
>>> u, s, vh = np.linalg.svd(b, full_matrices=True) >>> u.shape, s.shape, vh.shape ((2, 7, 8, 8), (2, 7, 3), (2, 7, 3, 3)) >>> np.allclose(b, np.matmul(u[..., :3] * s[..., None, :], vh)) True >>> np.allclose(b, np.matmul(u[..., :3], s[..., None] * vh)) True
基於簡化 SVD 的重建,4D 案例:
>>> u, s, vh = np.linalg.svd(b, full_matrices=False) >>> u.shape, s.shape, vh.shape ((2, 7, 8, 3), (2, 7, 3), (2, 7, 3, 3)) >>> np.allclose(b, np.matmul(u * s[..., None, :], vh)) True >>> np.allclose(b, np.matmul(u, s[..., None] * vh)) True
相關用法
- Python numpy linalg.solve用法及代碼示例
- Python numpy linalg.slogdet用法及代碼示例
- Python numpy linalg.pinv用法及代碼示例
- Python numpy linalg.eigh用法及代碼示例
- Python numpy linalg.tensorinv用法及代碼示例
- Python numpy linalg.LinAlgError用法及代碼示例
- Python numpy linalg.matrix_rank用法及代碼示例
- Python numpy linalg.det用法及代碼示例
- Python numpy linalg.cond用法及代碼示例
- Python numpy linalg.inv用法及代碼示例
- Python numpy linalg.eig用法及代碼示例
- Python numpy linalg.lstsq用法及代碼示例
- Python numpy linalg.norm用法及代碼示例
- Python numpy linalg.multi_dot用法及代碼示例
- Python numpy linalg.tensorsolve用法及代碼示例
- Python numpy linalg.qr用法及代碼示例
- Python numpy linalg.matrix_power用法及代碼示例
- Python numpy linalg.cholesky用法及代碼示例
- Python numpy linalg.eigvals用法及代碼示例
- Python numpy linalg.eigvalsh用法及代碼示例
- Python numpy linspace用法及代碼示例
- Python numpy lib.NumpyVersion用法及代碼示例
- Python numpy lib.Arrayterator用法及代碼示例
- Python numpy legendre.legint用法及代碼示例
- Python numpy laguerre.lagone用法及代碼示例
注:本文由純淨天空篩選整理自numpy.org大神的英文原創作品 numpy.linalg.svd。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。