linalg.
svd
奇异值分解。
什么时候? a 是一个二维数组,它被分解为 u @ np.diag(s) @ vh = (u * s) @ vh 在哪里 u 和 vh 是二维单一数组和 s 是1d数组 a 的奇异值。什么时候? a 是高维的,SVD以叠加模式应用,如下所述。
u @ np.diag(s) @ vh = (u * s) @ vh
实数或复数数组 a.ndim >= 2 .
a.ndim >= 2
如果为真(默认值), u 和 vh 有形状 (..., M, M) 和 (..., N, N) ,分别。否则,形状是 (..., M, K) 和 (..., K, N) ,分别为,其中 K = min(M, N) .
(..., M, M)
(..., N, N)
(..., M, K)
(..., K, N)
K = min(M, N)
是否计算 u 和 vh 除了 s . 默认为true。
如果属实, a 假设为Hermitian(实值对称),从而可以更有效地找到奇异值。默认为false。
1.17.0 新版功能.
一元数组。第一 a.ndim - 2 尺寸与输入尺寸相同 a . 最后两个维度的大小取决于 full_matrices . 仅在以下情况返回 compute_uv 是True。
a.ndim - 2
具有奇异值的向量,位于按降序排序的每个向量内。第一 a.ndim - 2 尺寸与输入尺寸相同 a .
如果SVD计算不收敛。
参见
scipy.linalg.svd
在SciPy中有类似的功能。
scipy.linalg.svdvals
计算矩阵的奇异值。
笔记
在 1.8.0 版更改: 广播规则适用,见 numpy.linalg 有关详细信息的文档。
numpy.linalg
使用lapack程序进行分解。 _gesdd .
_gesdd
SVD通常用于描述二维矩阵的因式分解。 . 下面将讨论更高维度的情况。在二维情况下,SVD写为 在哪里 , , 和 . 一维数组 s 包含的奇异值 a 和 u 和 vh 是酉的。行 vh 是的特征向量 以及 u 是的特征向量 . 在这两种情况下,相应的(可能非零)特征值由下式给出: s**2 .
s**2
如果 a 有两个以上的维度,则适用广播规则,如中所述 几个矩阵上的线性代数 . 这意味着SVD在“叠加”模式下工作:它迭代第一个索引的所有索引 a.ndim - 2 尺寸和每个组合的SVD应用于最后两个索引。矩阵 a 可以从分解中重建 (u * s[..., None, :]) @ vh 或 u @ (s[..., None] * vh) . (The @ 可以用函数替换运算符 np.matmul 对于低于3.5的python版本。)
(u * s[..., None, :]) @ vh
u @ (s[..., None] * vh)
@
np.matmul
如果 a 是一个 matrix 对象(与 ndarray ,那么所有的返回值也是如此。
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