numpy.linalg.lstsq

numpy.linalg.lstsq(a, b, rcond='warn')

Функция linalg.lstsq() решает задачу поиска наименьших квадратов для линейного матричного уравнения.

Метод наименьших квадратов основан на минимизации суммы квадратов отклонений значений некоторых функций от неизвестных переменных

Данный метод применяется для решения самых разных задач и в некотором смысле можно сказать, что он применим для решения систем линейных уравнений \(Ax = b\), где \(A\) - матрица коэфициентов с формой \(m \times n\), причем \(m \geqslant n\), т.е. количество строк может быть больше количества столбцов (неизвестных переменных). В общем случае, когда \(m > n\) система не имеет решения, но "расстояние" между векторами \(Ax\) и \(b\) может быть минимизировано.

Если матрица a является квадратной и обладает полным рангом, то решение x (до ошибки округления) является точным решением системы. В противном случае, если количество линейно независимых строк матрицы a меньше, равно или больше числа линейно независимых столбцов, то x не будет "точным" решением.

Если вычисление невозможно или не сходится то возвращается ошибка LinAlgError.

Параметры:
a - массив NumPy или подобнй массиву объект с формой \(m \times n\).
Матрица коэфициентов - массив с формой \(m \times n\).
b - массив NumPy или подобнй массиву объект с формой \(m\) или \(m \times k\).
Столбец(ы) зависимых переменных - массив с формой \(m\) или многомерный массив с формой \(m \times k\). Если массив b имеет форму \(m \times k\), то выполняется механизм транслирования и решение ищется для каждого столбца из b. Если b - это объект класса matrix, то все возвращаемые значения являются объектами этого же класса.
rcond - вещественное число (необязательный параметр).
Коэфициент "отбрасывания" малых значений массива a. Если какой-то элемент из a меньше чем rcond*max(a) то данный элемент будет обрабатываться как 0. С версии NumPy 1.14.0 данный параметр по умолчанию установлен в значение 'warn' что приводит к появлению предупреждения FutureWarning. В предыдущих версиях, по умолчанию rcond = -1 означало использование машинной точности, сейчас оно означает использование максимальной точности для используемого типа данных массива a. Что бы использовать новое значение точности и отключить появление предупреждения укажите rcond = None, что бы использовать старое значение укажите rcond = -1.
Возвращает:
x - массив NumPy с формой \(n\) или \(n \times k\).
Решение задачи наименьших квадратов для системы уравнений \(Ax=b\). Форма возвращаемого массива зависит от формы массивов a и b.
residuals - массив NumPy с формой \(1\), \(k\) или с формой \(n\) или \(0\).
Суммы "расстояний" для каждого столбца b - a*x. Если \(rank(a) < n\) или \(m < n\), то возвращается пустой массив. Если b одномеерный массив, то возвращается одномерный массив. Если b с формой \(m \times k\), то возвращается массив с формой \(k\).
rank - целое число.
Ранг матрицы a.
s - целое число.
Минимальное значение формы a равное min(m, n).
Смотрите так же:
linalg.solve


Примеры

Допустим у нас есть некоторый набор из 10 точек с координатами, которые будут имитировать зашумленные данные:

>>> import numpy as np
>>> from numpy import linalg as LA
>>> 
>>> x = np.arange(10)
>>> y = 2*x + 4 + 2*np.random.randn(10)
>>> 
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> y
array([ 2.59033617,  5.95751053,  8.79550346,  9.19608787, 11.80609286,
       16.39060504, 15.48248325, 20.22656891, 19.15524974, 22.06974761])

Изобразим данные точки:

>>> import matplotlib.pyplot as plt
>>> 
>>> plt.scatter(x, y)
<matplotlib.collections.PathCollection object at 0xa8f8310c>

Сгенерированные случайные данные

Давайте попробуем подобрать линию которая проходит через данные точки с минимальным расстоянием до каждой из них.

Для этого нам нужно составить систему уравнений y = Ap, где A - это массив вида [[x[0], 1], [x[1], 1], ..., [x[n], 1]], а p = [[m], [c]]. Создадим матрицу A:

>>> A = np.vstack([x, np.ones(len(x))]).T
>>> A
array([[0., 1.],
       [1., 1.],
       [2., 1.],
       ...,
       [7., 1.],
       [8., 1.],
       [9., 1.]])

Теперь найдем значения p:

>>> m, c = np.linalg.lstsq(A, y, rcond=None)[0]
>>> 
>>> m, c
(2.1108963817027457, 3.667984825826527)

Теперь изобразим данные вместе с полученной линией:

>>> plt.plot(x, m*x + c, 'r')
[<matplotlib.lines.Line2D object at 0xa8ff822c>]

Метод наименьших квадратов для решения системы линейных уравнений