mars.tensor.linalg.svd#

mars.tensor.linalg.svd(a, method='tsqr')[来源]#

奇异值分解。

a 是一个 2D 张量时,它被分解为 u @ np.diag(s) @ vh = (u * s) @ vh,其中 uvh 是 2D 单位张量,而 sa 的奇异值的 1D 张量。当 a 是更高维度时,SVD 以叠加模式应用,详细说明如下。

Parameters
  • a ((..., M, N) array_like) – 一个实数或复数张量,满足 a.ndim >= 2.

  • 方法 ({'tsqr'}, 可选) –

    用于计算QR分解的方法,默认是tsqr

    TSQR的介绍如下:

    A. Benson, D. Gleich, 和 J. Demmel. 在MapReduce架构中针对高宽比矩阵的直接QR分解。 IEEE国际大数据会议,2013年。 http://arxiv.org/abs/1301.1071

Returns

  • 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 时返回。

Raises

LinAlgError – 如果 SVD 计算未收敛。

备注

SVD通常用于描述二维矩阵 \(A\) 的分解。高维情况将在下面讨论。在二维情况下,SVD表示为 \(A = U S V^H\),其中 \(A = a\), \(U= u\), \(S= \mathtt{np.diag}(s)\)\(V^H = vh\)。一维张量 s 包含 a 的奇异值,并且 uvh 是单位的。vh 的行是 \(A^H A\) 的特征向量,u 的列是 \(A A^H\) 的特征向量。在这两种情况下,相应的(可能非零的)特征值由 s**2 给出。

如果 a 具有超过两个维度,则适用广播规则,如在 同时对多个矩阵进行线性代数 中所解释。这意味着SVD在“堆叠”模式下工作:它遍历第一个 a.ndim - 2 维度的所有索引,并对每个组合应用SVD于最后两个索引。矩阵 a 可以通过以下分解重构:(u * s[..., None, :]) @ vhu @ (s[..., None] * vh)。(@ 运算符可以在python版本低于3.5时被 mt.matmul 函数替换。)

示例

>>> import mars.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)

基于降维奇异值分解的重构,二维情况:

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