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.])