当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python numpy linalg.svd用法及代码示例


本文简要介绍 python 语言中 numpy.linalg.svd 的用法。

用法:

linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)

奇异值分解。

什么时候a是一个二维数组,它被分解为u @ np.diag(s) @ vh = (u * s) @ vh,其中uvh是二维酉阵列和s是一维数组a的奇异值。什么时候a是更高维的,SVD 以堆叠模式应用,如下所述。

参数

a (…, M, N) 数组

带有 a.ndim >= 2 的实数或复数数组。

full_matrices 布尔型,可选

如果为真(默认),uvh有形状(..., 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 通常被说明为二维矩阵的分解\(A\) .下面将讨论高维情况。在二维情况下,SVD 写为\(A = U S V^H\) ,其中\(A = a\) ,\(U= u\) ,\(S= \mathtt{np.diag}(s)\) \(V^H = vh\) .一维数组s包含的奇异值auvh是单一的。的行vh是的特征向量\(A^H A\) 和列u是的特征向量\(A A^H\) .在这两种情况下,对应的(可能非零)特征值由下式给出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

相关用法


注:本文由纯净天空筛选整理自numpy.org大神的英文原创作品 numpy.linalg.svd。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。