當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python numpy linalg.svd用法及代碼示例


本文簡要介紹 python 語言中 numpy.linalg.svd 的用法。

用法:

linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)

奇異值分解。

什麽時候a是一個二維數組,它被分解為u @ np.diag(s) @ vh = (u * s) @ vh,其中uvh是二維酉陣列和s是一維數組a的奇異值。什麽時候a是更高維的,SVD 以堆疊模式應用,如下所述。

參數

a (…, M, N) 數組

帶有 a.ndim >= 2 的實數或複數數組。

full_matrices 布爾型,可選

如果為真(默認),uvh有形狀(..., 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 通常被說明為二維矩陣的分解\(A\) .下麵將討論高維情況。在二維情況下,SVD 寫為\(A = U S V^H\) ,其中\(A = a\) ,\(U= u\) ,\(S= \mathtt{np.diag}(s)\) \(V^H = vh\) .一維數組s包含的奇異值auvh是單一的。的行vh是的特征向量\(A^H A\) 和列u是的特征向量\(A A^H\) .在這兩種情況下,對應的(可能非零)特征值由下式給出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

相關用法


注:本文由純淨天空篩選整理自numpy.org大神的英文原創作品 numpy.linalg.svd。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。