numpy.linalg.svd#
- linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)[来源]#
- 奇异值分解。 - 当 a 是一个二维数组,并且 - full_matrices=False时,它被分解为- u @ np.diag(s) @ vh = (u * s) @ vh,其中 u 和 vh 的共轭转置是具有正交列的二维数组,s 是 a 的奇异值的一维数组。当 a 是更高维时,SVD 将以堆叠模式应用,如下所述。- 参数:
- a(…, M, N) 类数组
- 一个实数或复数数组,其中 - a.ndim >= 2。
- full_matricesbool, 可选
- 如果为 True(默认),则 u 和 vh 的形状分别为 - (..., M, M)和- (..., N, N)。否则,形状分别为- (..., M, K)和- (..., K, N),其中- K = min(M, N)。
- compute_uvbool, 可选
- 除了 s 之外,是否计算 u 和 vh。默认为 True。 
- hermitianbool, 可选
- 如果为 True,则假设 a 是 Hermitian(如果为实值则对称),从而可以使用更高效的方法来查找奇异值。默认为 False。 
 
- 返回:
- 当 compute_uv 为 True 时,结果是一个具名元组,具有以下
- 属性名称
- 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 时返回。
 
- 引发:
- LinAlgError
- 如果 SVD 计算不收敛。 
 
 - 另请参阅 - scipy.linalg.svd
- SciPy 中类似的功能。 
- scipy.linalg.svdvals
- 计算矩阵的奇异值。 
 - 备注 - 该分解使用 LAPACK 例程 - _gesdd执行。- 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)从分解中重建。(对于低于 3.5 的 Python 版本,- @运算符可以替换为函数- np.matmul。)- 如果 a 是一个 - matrix对象(而不是- ndarray),那么所有返回值也是如此。- 示例 - >>> import numpy as np >>> rng = np.random.default_rng() >>> a = rng.normal(size=(9, 6)) + 1j*rng.normal(size=(9, 6)) >>> b = rng.normal(size=(2, 7, 8, 3)) + 1j*rng.normal(size=(2, 7, 8, 3)) - 基于完整 SVD 的重建,2D 情况 - >>> 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 的重建,2D 情况 - >>> 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