numpy.linalg.svd #
- 利纳尔格。svd ( a , full_matrices = True , compute_uv = True , Hermitian = False ) [来源] #
奇异值分解。
当a是 2D 数组且时
full_matrices=False
,它被分解为,其中 u和vh的埃尔米特转置是具有正交列的 2D 数组,s是a奇异值的 1D 数组。当a为高维时,SVD 以堆叠模式应用,如下所述。u @ np.diag(s) @ vh = (u * s) @ vh
- 参数:
- 一个(…, M, N) 类数组
具有 的实数或复数数组。
a.ndim >= 2
- full_matrices布尔值,可选
如果为 True(默认值),则u和vh分别具有形状和 。否则,形状分别为 和,其中 。
(..., M, M)
(..., N, N)
(..., M, K)
(..., K, N)
K = min(M, N)
- compute_uv布尔值,可选
除了s之外是否还计算u和vh。默认为真。
- Hermitian布尔值,可选
如果为真,则 a被假定为 Hermitian(如果是实值则对称),从而可以使用更有效的方法来查找奇异值。默认为 False。
1.17.0 版本中的新增功能。
- 返回:
- 当compute_uv为True时,结果是一个具有以下内容的命名元组
- 属性名称:
- U { (…, M, M), (…, M, K) } 数组
酉数组。第一个维度的大小与输入a的大小相同。最后两个维度的大小取决于full_matrices的值。仅当compute_uv为True时返回 。
a.ndim - 2
- S (…,K) 数组
每个向量中具有奇异值的向量按降序排序。第一个维度的大小与输入a的大小相同。
a.ndim - 2
- Vh { (…, N, N), (…, K, N) } 数组
酉数组。第一个维度的大小与输入a的大小相同。最后两个维度的大小取决于full_matrices的值。仅当compute_uv为True时返回 。
a.ndim - 2
- 加薪:
- 林算法错误
如果 SVD 计算不收敛。
也可以看看
scipy.linalg.svd
SciPy 中的类似功能。
scipy.linalg.svdvals
计算矩阵的奇异值。
笔记
版本 1.8.0 中更改:适用广播规则,
numpy.linalg
详细信息请参阅文档。使用 LAPACK 例程执行分解
_gesdd
。SVD 通常用于二维矩阵的分解\(A\)。下面将讨论高维情况。在 2D 情况下,SVD 写为\(A = U S V^H\), 在哪里\(A = a\),\(U= u\), \(S= \mathtt{np.diag}(s)\)和\(V^H = vh\)。一维数组s包含a 的奇异值,u和vh是酉的。vh的行是特征向量\(A^H A\)u的列是特征向量\(A A^H\)。在这两种情况下,相应的(可能非零)特征值由 给出
s**2
。如果a具有两个以上维度,则应用广播规则,如同时在多个矩阵上的线性代数中所述。这意味着 SVD 工作在“堆叠”模式:它迭代第一 维的所有索引,并且对于每个组合 SVD 应用于最后两个索引。矩阵a可以通过 或的 分解来重建。 (对于3.5以下的python版本,可以用函数替换该运算符。)
a.ndim - 2
(u * s[..., None, :]) @ vh
u @ (s[..., None] * vh)
@
np.matmul
如果a是一个
matrix
对象(而不是 anndarray
),那么所有返回值也是一个对象。例子
>>> 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