numpy.linalg.svd #

利纳尔格。svd ( a , full_matrices = True , compute_uv = True , Hermitian = False ) [来源] #

奇异值分解。

a是 2D 数组且时full_matrices=False,它被分解为,其中 u和vh的埃尔米特转置是具有正交列的 2D 数组,s是a奇异值的 1D 数组。当a为高维时,SVD 以堆叠模式应用,如下所述。u @ np.diag(s) @ vh = (u * s) @ vh

参数
一个(…, M, N) 类数组

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

full_matrices布尔值,可选

如果为 True(默认值),则uvh分别具有形状和 。否则,形状分别为 和,其中 。(..., M, M)(..., N, N)(..., M, K)(..., K, N)K = min(M, N)

compute_uv布尔值,可选

除了s之外是否还计算uvh。默认为真。

Hermitian布尔值,可选

如果为真,则 a被假定为 Hermitian(如果是实值则对称),从而可以使用更有效的方法来查找奇异值。默认为 False。

1.17.0 版本中的新增功能。

返回
compute_uv为True时,结果是一个具有以下内容的命名元组
属性名称:
U { (…, M, M), (…, M, K) } 数组

酉数组。第一个维度的大小与输入a的大小相同。最后两个维度的大小取决于full_matrices的值。仅当compute_uv为True时返回 。a.ndim - 2

S (…,K) 数组

每个向量中具有奇异值的向量按降序排序。第一个维度的大小与输入a的大小相同。a.ndim - 2

Vh { (…, N, N), (…, K, N) } 数组

酉数组。第一个维度的大小与输入a的大小相同。最后两个维度的大小取决于full_matrices的值。仅当compute_uv为True时返回 。a.ndim - 2

加薪
林算法错误

如果 SVD 计算不收敛。

也可以看看

scipy.linalg.svd

SciPy 中的类似功能。

scipy.linalg.svdvals

计算矩阵的奇异值。

笔记

版本 1.8.0 中更改:适用广播规则,numpy.linalg详细信息请参阅文档。

使用 LAPACK 例程执行分解_gesdd

SVD 通常用于二维矩阵的分解\(A\)。下面将讨论高维情况。在 2D 情况下,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 工作在“堆叠”模式:它迭代第一 维的所有索引,并且对于每个组合 SVD 应用于最后两个索引。矩阵a可以通过 或的 分解来重建。 (对于3.5以下的python版本,可以用函数替换该运算符。)a.ndim - 2(u * s[..., None, :]) @ vhu @ (s[..., None] * vh)@np.matmul

如果a是一个matrix对象(而不是 an 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