maxframe.tensor.linalg.svd#

maxframe.tensor.linalg.svd(a, method='tsqr')[源代码]#

奇异值分解。

a 是一个 2D tensor 时,它被分解为 u @ np.diag(s) @ vh = (u * s) @ vh,其中 uvh 是 2D 酉矩阵,而 sa 的奇异值组成的 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 的奇异值,uvh 是酉矩阵。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, :]) @ vhu @ (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