Spec-Zone.ru › NumPy 2.0

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API