mars.tensor.linalg.svd#
- mars.tensor.linalg.svd(a, method='tsqr')[来源]#
奇异值分解。
当 a 是一个 2D 张量时,它被分解为
u @ np.diag(s) @ vh = (u * s) @ vh,其中 u 和 vh 是 2D 单位张量,而 s 是 a 的奇异值的 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 的奇异值,并且 u 和 vh 是单位的。vh 的行是 \(A^H A\) 的特征向量,u 的列是 \(A A^H\) 的特征向量。在这两种情况下,相应的(可能非零的)特征值由
s**2给出。如果 a 具有超过两个维度,则适用广播规则,如在 同时对多个矩阵进行线性代数 中所解释。这意味着SVD在“堆叠”模式下工作:它遍历第一个
a.ndim - 2维度的所有索引,并对每个组合应用SVD于最后两个索引。矩阵 a 可以通过以下分解重构:(u * s[..., None, :]) @ vh或u @ (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