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