numpy.linalg.svd
- linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)[source]
-
Разложение по сингулярным значениям.
Когда
aявляется двумерным массивом, оно разлагается какu @ np.diag(s) @ vh = (u * s) @ vh, гдеuиvhявляются двумерными унитарными массивами, аs— одномерным массивом сингулярных значенийa. Когдаaимеет более высокую размерность, SVD применяется в режиме стекирования, как описано ниже.- Параметры
-
- a(…, M, N) array_like
-
Вещественный или комплексный массив с
a.ndim >= 2. - full_matricesbool, optional
-
Если True (по умолчанию),
uиvhимеют формы соответственно(..., M, M)и(..., N, N). В противном случае формы соответственно(..., M, K)и(..., K, N), гдеK = min(M, N). - compute_uvbool, optional
-
Вычислять ли
uиvhдополнительно кs? По умолчанию True. - hermitianbool, optional
-
Если True, предполагается, что
aявляется эрмитовым (симметричным, если вещественным), что позволяет использовать более эффективный метод для нахождения сингулярных значений. По умолчанию False.New in version 1.17.0.
- Возвращает
-
- u{ (…, M, M), (…, M, K) } array
-
Унитарный массив(ы). Первые
a.ndim - 2измерения имеют тот же размер, что и входной массивa. Размер последних двух измерений зависит от значенияfull_matrices. Возвращается только приcompute_uvравном True. - s(…, K) array
-
Вектор(ы) сингулярных значений, отсортированных в каждом векторе по убыванию. Первые
a.ndim - 2измерения имеют тот же размер, что и входной массивa. - vh{ (…, N, N), (…, K, N) } array
-
Унитарный массив(ы). Первые
a.ndim - 2измерения имеют тот же размер, что и входной массивa. Размер последних двух измерений зависит от значенияfull_matrices. Возвращается только приcompute_uvравном True.
- Возможные исключения
-
- LinAlgError
-
Если вычисление SVD не сходится.
См. также
scipy.linalg.svd-
Аналогичная функция в SciPy.
scipy.linalg.svdvals-
Вычисление сингулярных значений матрицы.
Примечания
Изменено в версии 1.8.0: Применяются правила широковещательной рассылки; см. документацию
numpy.linalgдля подробностей.Разложение выполняется с помощью процедуры LAPACK
_gesdd.Обычно SVD описывается для разложения двумерной матрицы \(A\). Случай с матрицами большей размерности обсуждается ниже. В двумерном случае SVD записывается как \(A = U S V^H\), где \(A = a\), \(U= u\), \(S= \mathtt{np.diag}(s)\) и \(V^H = vh\). Одномерный массив
sсодержит сингулярные значенияa, аuиvhявляются унитарными. Строкиvhявляются собственными векторами \(A^H A\), а столбцыu— собственными векторами \(A A^H\). В обоих случаях соответствующие (возможно, отличные от нуля) собственные значения даютсяs**2.Если
aимеет более двух измерений, то применяются правила широковещательной рассылки, как описано в Линейная алгебра для нескольких матриц одновременно. Это означает, что SVD работает в режиме стекирования: оно перебирает все индексы первыхa.ndim - 2измерений и для каждой комбинации применяется SVD к последним двум индексам. Матрицуaможно восстановить из разложения с помощью(u * s[..., None, :]) @ vhилиu @ (s[..., None] * vh). (Оператор@может быть заменен функциейnp.matmulдля версий Python ниже 3.5.)Если
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, двумерный случай:
>>> 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, двумерный случай:
>>> 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, четырёхмерный случай:
>>> 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, четырёхмерный случай:
>>> 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
© 2005–2022 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.21/reference/generated/numpy.linalg.svd.html