NumPy参考 >例行程序 >线性代数(numpy.linalg) > numpy.linalg.svd
numpy.linalg.
svd
(a,full_matrices = True,compute_uv = True,hermitian = False )[源代码] ¶奇异值分解。
当一个是2D阵列,它被分解为,其中ù和VH是2D阵列酉和š是一维数组一个的奇异值。当a高维时,如下所述,SVD以堆叠模式应用。u @ np.diag(s) @ vh
= (u * s) @ vh
带的实数或复数数组。a.ndim >= 2
如果为True(默认),则u和vh分别具有和
的形状。否则,形状分别为
和,其中
。(..., M, M)
(..., N, N)
(..., M, K)
(..., K, N)
K = min(M, N)
除s外是否计算u和vh。默认为True。
如果为True,则将a假定为Hermitian(如果为实值,则为对称),从而可以更有效地找到奇异值。默认为False。
1.17.0版中的新功能。
单一数组。第一维的大小与输入a的大小相同。最后两个维度的大小取决于full_matrices的值。仅在compute_uv为True 时返回
。a.ndim - 2
每个向量中具有奇异值的向量按降序排列。第一维的大小与输入a的大小相同。a.ndim - 2
单一数组。第一维的大小与输入a的大小相同。最后两个维度的大小取决于full_matrices的值。仅在compute_uv为True 时返回
。a.ndim - 2
如果SVD计算不收敛。
笔记
在版本1.8.0中更改:适用广播规则,numpy.linalg
有关详细信息,请参阅文档。
使用LAPACK例程执行分解_gesdd
。
通常将SVD描述为2D矩阵的分解。高维情况将在下面讨论。在2D情况下,SVD写为
,其中
,
,
和
。1D阵列小号
包含的奇异值一个和ü和VH是一体的。vh的行是的特征向量
,u的列是的特征向量
。在这两种情况下,对应的(可能非零)特征值均由给出
s**2
。
如果a具有两个以上的维,则适用广播规则,如一次线性代数在多个矩阵上所述。这意味着SVD在“堆叠”模式下工作:对第一个维度的所有索引进行迭代,
并且对于每种组合,SVD应用于最后两个索引。可以使用或
从分解中重建矩阵a。(该运算符可以替换为低于3.5的python版本的函数。)a.ndim - 2
(u * s[..., None, :]) @ vh
u @ (s[..., None] * vh)
@
np.matmul
如果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