Mínimos quadrados em NumPy

Muhammad Maisam Abbas 20 novembro 2021
Mínimos quadrados em NumPy

Este artigo apresentará como calcular AX = B com o método dos mínimos quadrados em Python.

Mínimos quadrados NumPy com função numpy.linalg.lstsq() em Python

A equação AX = B é conhecida como equação do array linear. A função numpy.linalg.lstsq() pode ser usada para resolver a equação do array linear AX = B com o método dos mínimos quadrados em Python. Na verdade, é bastante simples. Esta função pega as matrizes e retorna a solução dos mínimos quadrados para a equação do array linear na forma de outra matriz. Veja o seguinte exemplo de código.

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])

Resultado:

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

No código acima, calculamos a solução para a equação do array linear AX = B com a função np.linalg.lstsq() em Python. Este método se torna um pouco complicado quando começamos a adicionar pesos às nossas matrizes. Existem dois métodos principais que podemos usar para encontrar a solução para esse tipo de problema.

A primeira solução envolve o uso de indexação de array com o especificador np.newaxis para adicionar uma nova dimensão aos pesos. É ilustrado no exemplo de codificação abaixo.

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])

Resultado:

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

No código acima, calculamos a solução para a equação do array linear AX = B junto com os pesos W usando as funções np.newaxis e np.linalg.lstsq() em Python. Este método funciona bem, mas não é muito fácil de entender e legível.

A segunda solução é um pouco mais legível e fácil de entender. Envolve transformar os pesos em um array diagonal e então usá-la. Isso é demonstrado no exemplo de codificação abaixo.

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])

Resultado:

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

No código acima, calculamos a solução para a equação do array linear AX = B junto com os pesos W convertendo os pesos em um array diagonal e usando a função np.linalg.lstsq().

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn