scipy.linalg.

svdvals#

scipy.linalg.svdvals(a, overwrite_a=False, check_finite=True)[原始碼]#

計算矩陣的奇異值。

參數:
a(M, N) 類陣列

要分解的矩陣。

overwrite_abool,可選

是否覆寫 a;可能提升效能。預設為 False。

check_finitebool,可選

是否檢查輸入矩陣僅包含有限數字。停用此選項可能提升效能,但如果輸入包含無限值或 NaN,可能導致問題(崩潰、非終止)。

傳回:
s(min(M, N),) ndarray

奇異值,依遞減順序排序。

引發:
LinAlgError

如果 SVD 計算不收斂。

另請參閱

svd

計算矩陣的完整奇異值分解。

diagsvd

給定向量 s,建構 Sigma 矩陣。

範例

>>> import numpy as np
>>> from scipy.linalg import svdvals
>>> m = np.array([[1.0, 0.0],
...               [2.0, 3.0],
...               [1.0, 1.0],
...               [0.0, 2.0],
...               [1.0, 0.0]])
>>> svdvals(m)
array([ 4.28091555,  1.63516424])

我們可以透過計算 m.dot(u) 在 (x,y) 平面中所有單位向量 u 上的最大長度,來驗證 m 的最大奇異值。我們用大量樣本來近似「所有」單位向量。因為線性關係,我們只需要角度在 [0, pi] 範圍內的單位向量。

>>> t = np.linspace(0, np.pi, 2000)
>>> u = np.array([np.cos(t), np.sin(t)])
>>> np.linalg.norm(m.dot(u), axis=0).max()
4.2809152422538475

p 是一個秩為 1 的投影矩陣。在精確算術下,其奇異值應為 [1, 0, 0, 0]。

>>> v = np.array([0.1, 0.3, 0.9, 0.3])
>>> p = np.outer(v, v)
>>> svdvals(p)
array([  1.00000000e+00,   2.02021698e-17,   1.56692500e-17,
         8.15115104e-34])

正交矩陣的奇異值皆為 1。在此,我們使用 scipy.stats.ortho_grouprvs() 方法建立一個隨機正交矩陣。

>>> from scipy.stats import ortho_group
>>> orth = ortho_group.rvs(4)
>>> svdvals(orth)
array([ 1.,  1.,  1.,  1.])