scipy.linalg.
svdvals#
- scipy.linalg.svdvals(a, overwrite_a=False, check_finite=True)[source]#
计算矩阵的奇异值。
此文档假定数组参数具有指定的“核心”形状。然而,此函数的数组参数可能在核心形状前附加额外的“批次”维度。在这种情况下,该数组被视为低维切片的批次;详见批处理线性操作。
- 参数:
- a(M, N) 数组类型
要分解的矩阵。
- overwrite_a布尔值, 可选
是否覆盖 a;可能会提高性能。默认为 False。
- check_finite布尔值, 可选
是否检查输入矩阵仅包含有限数值。禁用此选项可能会提高性能,但如果输入包含无穷大或 NaN,可能会导致问题(崩溃、无法终止)。
- 返回:
- s(min(M, N),) ndarray
奇异值,按降序排列。
- 引发:
- LinAlgError
如果 SVD 计算不收敛。
示例
>>> 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])
我们可以通过计算在 (x,y) 平面上所有单位向量 u 中 m.dot(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_group
的 rvs() 方法创建一个随机正交矩阵。>>> from scipy.stats import ortho_group >>> orth = ortho_group.rvs(4) >>> svdvals(orth) array([ 1., 1., 1., 1.])