numpy.linalg.svd
- linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)[source]
-
Разложение по сингулярным значениям.
Когда
aявляется двумерным массивом, иfull_matrices=False, то оно разлагается какu @ np.diag(s) @ vh = (u * s) @ vh, гдеuи эрмитово-сопряжённая матрицаvhявляются двумерными массивами с ортогональными столбцами, аs— одномерный массив сингулярных значенийa. Когдаaимеет более высокую размерность, SVD применяется в режиме стекирования, как описано ниже.- Параметры:
-
- a(…, M, N) array_like
-
Вещественный или комплексный массив с
a.ndim >= 2. - full_matricesbool, необязательно
-
Если True (по умолчанию),
uиvhимеют формы(..., M, M)и(..., N, N), соответственно. В противном случае формы равны(..., M, K)и(..., K, N), соответственно, гдеK = min(M, N). - compute_uvbool, необязательно
-
Вычислять ли
uиvhдополнительно кs. По умолчанию True. - hermitianbool, необязательно
-
Если True, предполагается, что
aявляется эрмитовой матрицей (симметричной, если вещественной), что позволяет использовать более эффективный метод для поиска сингулярных значений. По умолчанию False.Добавлена в версии 1.17.0.
- Возвращаемые значения:
-
- Когда
compute_uvравно True, результат — именованная кортеж с именами атрибутов: - U{ (…, M, M), (…, M, K) } массив
-
Унитарный массив. Первые
a.ndim - 2измерения имеют тот же размер, что и у входного массиваa. Размер последних двух измерений зависит от значенияfull_matrices. Возвращается только когдаcompute_uvравно True. - S(…, K) массив
-
Вектор(ы) с сингулярными значениями, в каждом векторе отсортированными по убыванию. Первые
a.ndim - 2измерения имеют тот же размер, что и у входного массиваa. - Vh{ (…, N, N), (…, K, N) } массив
-
Унитарный массив. Первые
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–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/generated/numpy.linalg.svd.html