maxframe.tensor.linalg.svd#
- maxframe.tensor.linalg.svd(a, method='tsqr')[源代码]#
奇异值分解。
当 a 是一个 2D tensor 时,它被分解为
u @ np.diag(s) @ vh = (u * s) @ vh,其中 u 和 vh 是 2D 酉矩阵,而 s 是 a 的奇异值组成的 1D tensor。当 a 是高维时,SVD 会按堆叠模式应用,如下所述。- 参数:
a ((..., M, N) array_like) -- 一个实数或复数 tensor,其维度
a.ndim >= 2。method ({'tsqr'}, optional) -- 计算 QR 分解的方法,默认使用 tsqr。TSQR 的描述见于:A. Benson, D. Gleich, 和 J. Demmel,直接 QR 分解用于 MapReduce 架构中的高瘦矩阵,IEEE 大数据国际会议,2013 年,http://arxiv.org/abs/1301.1071
- 返回:
u ({ (..., M, M), (..., M, K) } tensor) -- 酉矩阵。前
a.ndim - 2维度与输入 a 相同。最后两个维度的大小取决于 full_matrices 的值。仅在 compute_uv 为 True 时返回。s ((..., K) tensor) -- 包含奇异值的向量,每个向量按降序排列。前
a.ndim - 2维度与输入 a 相同。vh ({ (..., N, N), (..., K, N) } tensor) -- 酉矩阵。前
a.ndim - 2维度与输入 a 相同。最后两个维度的大小取决于 full_matrices 的值。仅在 compute_uv 为 True 时返回。
- 抛出:
LinAlgError -- 如果 SVD 计算不收敛。
备注
SVD 通常用于描述 2D 矩阵 \(A\) 的分解。高维情况将在下文讨论。在 2D 情况下,SVD 可写作 \(A = U S V^H\),其中 \(A = a\),\(U = u\),\(S = \mathtt{np.diag}(s)\) 且 \(V^H = vh\)。1D tensor s 包含 a 的奇异值,u 和 vh 是酉矩阵。vh 的行是 \(A^H A\) 的特征向量,u 的列是 \(A A^H\) 的特征向量。这两种情况下对应的(可能非零)特征值由
s**2给出。如果 a 的维度超过二维,则遵循广播规则,如 Linear algebra on several matrices at once 所述。这意味着 SVD 在“堆叠”模式下工作:它会遍历前
a.ndim - 2个维度的所有索引,并对每个组合将 SVD 应用于最后两个维度。可以通过(u * s[..., None, :]) @ vh或u @ (s[..., None] * vh)从分解中重构矩阵 a。(对于低于 3.5 的 Python 版本,@运算符可以替换为函数mt.matmul。)示例
>>> import maxframe.tensor as mt >>> a = mt.random.randn(9, 6) + 1j*mt.random.randn(9, 6) >>> b = mt.random.randn(2, 7, 8, 3) + 1j*mt.random.randn(2, 7, 8, 3)
基于简化 SVD 的重构,二维情况:
>>> u, s, vh = mt.linalg.svd(a) >>> 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