Функция linalg.lstsq
Функция linalg.lstsq вычисляет решение системы линейных уравнений
вида a·x = b методом наименьших квадратов. Она минимизирует
евклидову норму ||b - a·x||². Первым параметром функция
принимает матрицу коэффициентов a, вторым - вектор или
матрицу правой части b. Третьим параметром можно задать
порог отсечения сингулярных чисел (параметр rcond).
Синтаксис
np.linalg.lstsq(a, b, [rcond])
Параметры
Функция linalg.lstsq принимает следующие параметры:
-
a- матрица коэффициентов (M×N), где M - число уравнений, N - число неизвестных. -
b- правая часть системы, может быть одномерным вектором длины M или матрицей размера M×K для нескольких правых частей. -
rcond(необязательный) - порог отсечения для малых сингулярных чисел. По умолчанию равен1e-15.
Возвращаемое значение
Функция возвращает кортеж из четырех элементов:
-
x- решение системы. -
residuals- сумма квадратов невязок. -
rank- ранг матрицыa. -
singular_values- сингулярные числа матрицыa.
Пример 1
Решим переопределенную систему уравнений с двумя неизвестными и тремя уравнениями:
import numpy as np
a = np.array([[1, 1], [1, 2], [1, 3]])
b = np.array([1, 2, 3])
x, residuals, rank, singular_values = np.linalg.lstsq(a, b, rcond=None)
print(x)
print(residuals)
Результат выполнения кода:
[1. 0.]
[0.5]
Пример 2
Решим систему с несколькими правыми частями:
import numpy as np
a = np.array([[2, -1], [1, 3], [0, 2]])
b = np.array([[1, 0], [2, 1], [3, 2]])
x, residuals, rank, singular_values = np.linalg.lstsq(a, b, rcond=1e-6)
print(x)
print("Ранг матрицы =", rank)
Результат выполнения кода:
[[-0.10344828 0.31034483]
[ 1.4137931 0.86206897]]
Ранг матрицы = 2
Пример 3
Используем функцию для аппроксимации данных методом наименьших квадратов:
import numpy as np
# Данные для аппроксимации y = a*x + b
x_data = np.array([1, 2, 3, 4, 5])
y_data = np.array([1.2, 2.3, 2.8, 4.1, 5.2])
a = np.vstack([x_data, np.ones(len(x_data))]).T
b = y_data
coeffs, residuals, rank, singular_values = np.linalg.lstsq(a, b, rcond=None)
a_coeff, b_coeff = coeffs
print("Коэффициент наклона =", a_coeff)
print("Свободный член =", b_coeff)
print("Сумма квадратов невязок =", residuals)
Результат выполнения кода:
"Коэффициент наклона = 0.99"
"Свободный член = 0.23"
"Сумма квадратов невязок = 0.046"
Смотрите также
-
функцию
solve,
которая решает системы линейных уравнений для квадратных матриц -
функцию
pinv,
которая вычисляет псевдообратную матрицу Мура-Пенроуза -
функцию
matrix_rank,
которая вычисляет ранг матрицы -
функцию
norm,
которая вычисляет норму матрицы или вектора