上一主题

numpy.linalg.qr

下一主题

numpy.linalg.eig

numpy.linalg.svd

numpy.linalg.svd(a, full_matrices=1, compute_uv=1)[source]

奇异值分解。

将矩阵a视为u * np.diag(s) t5> v,其中uv是幺正的且sa的奇异值。

参数:

a:(...,M,N)array_like

形状的实数或复数矩阵(MN)。

full_matrices:bool,可选

If True (default), u and v have the shapes (M, M) and (N, N), respectively. 否则,形状分别为(MK)和(KN),其中 K = min(MN)。

compute_uv:bool,可选

除了s之外是否计算uv。默认为True。

返回:

u:{(...,M,M),(...,M,K)}数组

酉矩阵。实际形状取决于full_matrices的值。仅当compute_uv为True时返回。

s:(...,K)数组

每个矩阵的奇异值,按降序排列。

v:{(...,N,N),(...,K,N)}数组

酉矩阵。实际形状取决于full_matrices的值。仅当compute_uv为True时返回。

异常:

LinAlgError

如果SVD计算不收敛。

笔记

版本1.8.0中的新功能。

广播规则适用,有关详细信息,请参阅numpy.linalg文档。

使用LAPACK程序_gesdd执行分解

SVD通常写为a = U S VH / t0>。由此函数返回的vV.Hu =

如果U是酉矩阵,则意味着满足UH = inv(U) / t2>。

v的行是a.H a的特征向量。u的列是a a.H的特征向量。对于v中的行iu中的列i,对应的特征值是s[i]**2

如果a矩阵对象(而不是ndarray),那么所有返回值也是如此。

例子

>>> a = np.random.randn(9, 6) + 1j*np.random.randn(9, 6)

基于全SVD的重建:

>>> U, s, V = np.linalg.svd(a, full_matrices=True)
>>> U.shape, V.shape, s.shape
((9, 9), (6, 6), (6,))
>>> S = np.zeros((9, 6), dtype=complex)
>>> S[:6, :6] = np.diag(s)
>>> np.allclose(a, np.dot(U, np.dot(S, V)))
True

基于减少SVD的重建:

>>> U, s, V = np.linalg.svd(a, full_matrices=False)
>>> U.shape, V.shape, s.shape
((9, 6), (6, 6), (6,))
>>> S = np.diag(s)
>>> np.allclose(a, np.dot(U, np.dot(S, V)))
True