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 не сходится.
Смотрите также
Примеры
>>> 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