scipy.linalg.

svd#

scipy.linalg.svd(a, full_matrices=True, compute_uv=True, overwrite_a=False, check_finite=True, lapack_driver='gesdd')[источник]#

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

Факторизует матрицу a в две унитарные матрицы U и Vh, и одномерный массив s сингулярных значений (вещественных, неотрицательных) таких, что a == U @ S @ Vh, где S является подходящей матрицей нулей с главной диагональю s.

Документация написана в предположении, что аргументы-массивы имеют указанные «основные» формы. Однако аргументы-массивы этой функции могут иметь дополнительные «пакетные» измерения, добавленные перед основной формой. В этом случае массив обрабатывается как пакет низкоразмерных срезов; см. Пакетные линейные операции подробности.

Параметры:
a(M, N) array_like

Матрица для разложения.

full_matricesbool, необязательно

Если True (по умолчанию), U и Vh имеют форму (M, M), (N, N). Если False, формы (M, K) и (K, N), где K = min(M, N).

compute_uvbool, необязательно

Вычислять ли также U и Vh в дополнение к s. По умолчанию True.

overwrite_abool, необязательно

Перезаписывать ли a; может улучшить производительность. По умолчанию False.

check_finitebool, необязательно

Проверять ли, что входная матрица содержит только конечные числа. Отключение может повысить производительность, но может привести к проблемам (сбоям, незавершению) если входные данные содержат бесконечности или NaN.

lapack_driver{‘gesdd’, ‘gesvd’}, опционально

Использовать ли более эффективный подход «разделяй и властвуй» ('gesdd') или общий прямоугольный подход ('gesvd') для вычисления SVD. MATLAB и Octave используют 'gesvd' подход. По умолчанию 'gesdd'.

Возвращает:
Undarray

Унитарная матрица, содержащая левые сингулярные векторы в качестве столбцов. Имеет форму (M, M) или (M, K), в зависимости от full_matrices.

sndarray

Сингулярные значения, отсортированные в порядке невозрастания. Формы (K,), где K = min(M, N).

Vhndarray

Унитарная матрица, имеющая правые сингулярные векторы в качестве строк. Формы (N, N) или (K, N) в зависимости от full_matrices.

Для compute_uv=False, только s возвращается.
Вызывает:
LinAlgError

Если вычисление SVD не сходится.

Смотрите также

svdvals

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

diagsvd

Построить матрицу Sigma, заданную вектор s.

Примеры

>>> import numpy as np
>>> from scipy import linalg
>>> rng = np.random.default_rng()
>>> m, n = 9, 6
>>> a = rng.standard_normal((m, n)) + 1.j*rng.standard_normal((m, n))
>>> U, s, Vh = linalg.svd(a)
>>> U.shape,  s.shape, Vh.shape
((9, 9), (6,), (6, 6))

Восстановить исходную матрицу из разложения:

>>> sigma = np.zeros((m, n))
>>> for i in range(min(m, n)):
...     sigma[i, i] = s[i]
>>> a1 = np.dot(U, np.dot(sigma, Vh))
>>> np.allclose(a, a1)
True

В качестве альтернативы используйте full_matrices=False (обратите внимание, что форма U затем (m, n) вместо (m, m)):

>>> U, s, Vh = linalg.svd(a, full_matrices=False)
>>> U.shape, s.shape, Vh.shape
((9, 6), (6,), (6, 6))
>>> S = np.diag(s)
>>> np.allclose(a, np.dot(U, np.dot(S, Vh)))
True
>>> s2 = linalg.svd(a, compute_uv=False)
>>> np.allclose(s, s2)
True