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