numpy.linalg.svd¶
-
numpy.linalg.
svd
(a, full_matrices=1, compute_uv=1)[source]¶ 奇异值分解。
将矩阵a视为
u * np.diag(s) t5> v
,其中u和v是幺正的且s的a的奇异值。参数: a:(...,M,N)array_like
形状的实数或复数矩阵(M,N)。
full_matrices:bool,可选
If True (default), u and v have the shapes (M, M) and (N, N), respectively. 否则,形状分别为(M,K)和(K,N),其中 K = min(M,N)。
compute_uv:bool,可选
除了s之外是否计算u和v。默认为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>。
由此函数返回的v是V.H
和u =
。如果
U
是酉矩阵,则意味着满足UH = inv(U) / t2>。
v的行是
a.H a
的特征向量。u的列是a a.H
的特征向量。对于v中的行i
和u中的列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