本文简要介绍 python 语言中 numpy.linalg.svd
的用法。
用法:
linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)
奇异值分解。
什么时候a是一个二维数组,它被分解为
u @ np.diag(s) @ vh = (u * s) @ vh
,其中u和vh是二维酉阵列和s是一维数组a的奇异值。什么时候a是更高维的,SVD 以堆叠模式应用,如下所述。- a: (…, M, N) 数组
带有
a.ndim >= 2
的实数或复数数组。- full_matrices: 布尔型,可选
如果为真(默认),u和vh有形状
(..., M, M)
和(..., N, N)
, 分别。否则,形状为(..., M, K)
和(..., K, N)
,分别在哪里K = min(M, N)
.- compute_uv: 布尔型,可选
除了 s 之外,是否计算 u 和 vh。默认为真。
- hermitian: 布尔型,可选
如果为 True,则假定 a 为 Hermitian(如果为实值,则为对称),从而可以更有效地找到奇异值。默认为假。
- u: { (…, M, M), (…, M, K) } 数组
单一数组。首先
a.ndim - 2
尺寸与输入尺寸相同a.最后两个维度的大小取决于full_matrices.仅返回时compute_uv为真。- s: (…, K) 数组
具有奇异值的向量,在每个向量中按降序排序。首先
a.ndim - 2
尺寸与输入尺寸相同a.- vh: { (…, N, N), (…, K, N) } 数组
单一数组。首先
a.ndim - 2
尺寸与输入尺寸相同a.最后两个维度的大小取决于full_matrices.仅返回时compute_uv为真。
- LinAlgError
如果 SVD 计算不收敛。
参数:
返回:
抛出:
注意:
使用 LAPACK 例程
_gesdd
执行分解。SVD 通常被说明为二维矩阵的分解
.下面将讨论高维情况。在二维情况下,SVD 写为 ,其中 , , 和 .一维数组s包含的奇异值a和u和vh是单一的。的行vh是的特征向量 和列u是的特征向量 .在这两种情况下,对应的(可能非零)特征值由下式给出s**2
.如果a具有两个以上的维度,则适用广播规则,如中所述一次在多个矩阵上进行线性代数.这意味着 SVD 在 “stacked” 模式下工作:它迭代第一个索引的所有索引
a.ndim - 2
尺寸和每个组合 SVD 应用于最后两个索引。矩阵a可以从分解中重建(u * s[..., None, :]) @ vh
或者u @ (s[..., None] * vh)
. (这@
运算符可以替换为函数np.matmul
对于低于 3.5 的 python 版本。)如果a是一个
matrix
对象(相对于ndarray
),那么所有的返回值也是如此。例子:
>>> a = np.random.randn(9, 6) + 1j*np.random.randn(9, 6) >>> b = np.random.randn(2, 7, 8, 3) + 1j*np.random.randn(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
相关用法
- Python numpy linalg.solve用法及代码示例
- Python numpy linalg.slogdet用法及代码示例
- Python numpy linalg.pinv用法及代码示例
- Python numpy linalg.eigh用法及代码示例
- Python numpy linalg.tensorinv用法及代码示例
- Python numpy linalg.LinAlgError用法及代码示例
- Python numpy linalg.matrix_rank用法及代码示例
- Python numpy linalg.det用法及代码示例
- Python numpy linalg.cond用法及代码示例
- Python numpy linalg.inv用法及代码示例
- Python numpy linalg.eig用法及代码示例
- Python numpy linalg.lstsq用法及代码示例
- Python numpy linalg.norm用法及代码示例
- Python numpy linalg.multi_dot用法及代码示例
- Python numpy linalg.tensorsolve用法及代码示例
- Python numpy linalg.qr用法及代码示例
- Python numpy linalg.matrix_power用法及代码示例
- Python numpy linalg.cholesky用法及代码示例
- Python numpy linalg.eigvals用法及代码示例
- Python numpy linalg.eigvalsh用法及代码示例
- Python numpy linspace用法及代码示例
- Python numpy lib.NumpyVersion用法及代码示例
- Python numpy lib.Arrayterator用法及代码示例
- Python numpy legendre.legint用法及代码示例
- Python numpy laguerre.lagone用法及代码示例
注:本文由纯净天空筛选整理自numpy.org大神的英文原创作品 numpy.linalg.svd。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。