scipy.linalg.

svdvals#

scipy.linalg.svdvals(a, overwrite_a=False, check_finite=True)[источник]#

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

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

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

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

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

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

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

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

Возвращает:
s(min(M, N),) ndarray

Сингулярные значения, отсортированные в порядке убывания.

Вызывает:
LinAlgError

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

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

svd

Вычислить полное сингулярное разложение матрицы.

diagsvd

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

Примеры

>>> import numpy as np
>>> from scipy.linalg import svdvals
>>> m = np.array([[1.0, 0.0],
...               [2.0, 3.0],
...               [1.0, 1.0],
...               [0.0, 2.0],
...               [1.0, 0.0]])
>>> svdvals(m)
array([ 4.28091555,  1.63516424])

Мы можем проверить максимальное сингулярное значение m вычисляя максимальную длину m.dot(u) по всем единичным векторам u в плоскости (x,y). Мы аппроксимируем «все» единичные векторы большой выборкой. Из-за линейности нам нужны только единичные векторы с углами в [0, pi].

>>> t = np.linspace(0, np.pi, 2000)
>>> u = np.array([np.cos(t), np.sin(t)])
>>> np.linalg.norm(m.dot(u), axis=0).max()
4.2809152422538475

p является проекционной матрицей ранга 1. При точной арифметике её сингулярные значения были бы [1, 0, 0, 0].

>>> v = np.array([0.1, 0.3, 0.9, 0.3])
>>> p = np.outer(v, v)
>>> svdvals(p)
array([  1.00000000e+00,   2.02021698e-17,   1.56692500e-17,
         8.15115104e-34])

Сингулярные значения ортогональной матрицы все равны 1. Здесь мы создаём случайную ортогональную матрицу, используя rvs() метод scipy.stats.ortho_group.

>>> from scipy.stats import ortho_group
>>> orth = ortho_group.rvs(4)
>>> svdvals(orth)
array([ 1.,  1.,  1.,  1.])