Наименьшие квадраты в NumPy

В этой статье будет рассказано, как вычислить AX = B методом наименьших квадратов в Python.

Метод наименьших квадратов NumPy с функцией numpy.linalg.lstsq() в Python

Уравнение AX = B известно как линейное матричное уравнение. Функция numpy.linalg.lstsq() может использоваться для решения линейного матричного уравнения AX = B методом наименьших квадратов в Python. На самом деле это довольно просто. Эта функция принимает матрицы и возвращает решение линейного матричного уравнения методом наименьших квадратов в виде другой матрицы. См. Следующий пример кода.

import numpy as np

A=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,0,0]]
B=[1,1,1,1,1]

X=np.linalg.lstsq(A, B, rcond = -1)
print (X[0])

Выход:

[5.00000000e-01 5.00000000e-01 1.09109979e-16 1.64621130e-16]

В приведенном выше коде мы вычислили решение линейного матричного уравнения AX = B с помощью функции np.linalg.lstsq() в Python. Этот метод становится немного сложнее, когда мы начинаем добавлять веса к нашим матрицам. Есть два основных метода, которые мы можем использовать для решения этой проблемы.

Первое решение включает использование индексации массива со спецификатором np.newaxis для добавления нового измерения к весам. Это проиллюстрировано в приведенном ниже примере кодирования.

import numpy as np

A=np.array([[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,0,0]])
B = np.array([1,1,1,1,1])

W = np.array([1,2,3,4,5])

Aw = A * np.sqrt(W[:,np.newaxis])
Bw = B * np.sqrt(W)

X = np.linalg.lstsq(Aw, Bw, rcond = -1)
print(X[0])

Выход:

[ 5.00000000e-01  5.00000000e-01 -4.40221936e-17  1.14889576e-17]

В приведенном выше коде мы вычислили решение линейного матричного уравнения AX = B вместе с весами W с помощью функций np.newaxis и np.linalg.lstsq() в Python. Этот метод работает нормально, но его не очень легко понять и прочитать.

Второе решение более читабельно и понятно. Он включает в себя преобразование весов в диагональную матрицу, а затем ее использование. Это продемонстрировано в приведенном ниже примере кодирования.

import numpy as np

A=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,0,0]]
B = [1,1,1,1,1]
W = [1,2,3,4,5]

W = np.sqrt(np.diag(W))

Aw = np.dot(W,A)
Bw = np.dot(B,W)

X = np.linalg.lstsq(Aw, Bw, rcond = -1)
print(X[0])

Выход:

[ 5.00000000e-01  5.00000000e-01 -4.40221936e-17  1.14889576e-17]

В приведенном выше коде мы вычислили решение линейного матричного уравнения AX = B вместе с весами W путем преобразования весов в диагональную матрицу и последующего использования функции np.linalg.lstsq().