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 是1d数组 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可选的布尔

是否计算 uvh 除了 s . 默认为true。

hermitian可选的布尔

如果属实, a 假设为Hermitian(实值对称),从而可以更有效地找到奇异值。默认为false。

1.17.0 新版功能.

返回
u(…,m,m),(…,m,k)数组

一元数组。第一 a.ndim - 2 尺寸与输入尺寸相同 a . 最后两个维度的大小取决于 full_matrices . 仅在以下情况返回 compute_uv 是True。

s(…,K)阵列

具有奇异值的向量,位于按降序排序的每个向量内。第一 a.ndim - 2 尺寸与输入尺寸相同 a .

vh(…,N,N),(…,K,N)数组

一元数组。第一 a.ndim - 2 尺寸与输入尺寸相同 a . 最后两个维度的大小取决于 full_matrices . 仅在以下情况返回 compute_uv 是True。

加薪
LinAlgError

如果SVD计算不收敛。

参见

scipy.linalg.svd

在SciPy中有类似的功能。

scipy.linalg.svdvals

计算矩阵的奇异值。

笔记

在 1.8.0 版更改: 广播规则适用,见 numpy.linalg 有关详细信息的文档。

使用lapack程序进行分解。 _gesdd .

SVD通常用于描述二维矩阵的因式分解。 A . 下面将讨论更高维度的情况。在二维情况下,SVD写为 A = U S V^H 在哪里 A = aU= uS= \mathtt{{np.diag}}(s)V^H = vh . 一维数组 s 包含的奇异值 auvh 是酉的。行 vh 是的特征向量 A^H A 以及 u 是的特征向量 A A^H . 在这两种情况下,相应的(可能非零)特征值由下式给出: s**2 .

如果 a 有两个以上的维度,则适用广播规则,如中所述 几个矩阵上的线性代数 . 这意味着SVD在“叠加”模式下工作:它迭代第一个索引的所有索引 a.ndim - 2 尺寸和每个组合的SVD应用于最后两个索引。矩阵 a 可以从分解中重建 (u * s[..., None, :]) @ vhu @ (s[..., None] * vh) . (The @ 可以用函数替换运算符 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的重建,二维案例:

>>> 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的重建,二维案例:

>>> 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