numpy.linalg.svd#

linalg.svd(a, full_matrices=True, compute_uv=True, эрмитов=False)[источник]#

Сингулярное разложение.

Когда a является двумерным массивом, и full_matrices=False, затем он факторизуется как u @ np.diag(s) @ vh = (u * s) @ vh, где u и эрмитово сопряженная матрица vh являются 2D массивами с ортонормированными столбцами и s является одномерным массивом aсингулярные значения. Когда a ) основаны на LLVM и могут быть использованы для нативной компиляции. Требования лицензирования могут быть обременительными.

Параметры:
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.

эрмитовbool, необязательно

Если True, a предполагается эрмитовой (симметричной, если вещественнозначная), что позволяет использовать более эффективный метод поиска сингулярных значений. По умолчанию False.

Возвращает:
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

Вычисление сингулярных значений матрицы.

Примечания

Когда compute_uv если True, результат представляет собой namedtuple со следующими именами атрибутов: U, S, и Vh.

Разложение выполняется с использованием подпрограммы LAPACK _gesdd.

SVD обычно описывается для факторизации 2D-матрицы \(A\). Многомерный случай будет рассмотрен ниже. В 2D случае 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). (The @ оператор может быть заменён функцией np.matmul для версий python ниже 3.5.)

Если a является matrix объект (в отличие от ndarray), то все возвращаемые значения также

Примеры

>>> import numpy as np
>>> rng = np.random.default_rng()
>>> a = rng.normal(size=(9, 6)) + 1j*rng.normal(size=(9, 6))
>>> b = rng.normal(size=(2, 7, 8, 3)) + 1j*rng.normal(size=(2, 7, 8, 3))

Восстановление на основе полного SVD, 2D случай:

>>> 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, 2D случай:

>>> 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, 4D случай:

>>> 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, 4D случай:

>>> 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