Minimi quadrati in NumPy

Muhammad Maisam Abbas 4 luglio 2021
Minimi quadrati in NumPy

Questo articolo introdurrà come calcolare AX = B con il metodo dei minimi quadrati in Python.

NumPy dei minimi quadrati con la funzione numpy.linalg.lstsq() in Python

L’equazione AX = B è nota come equazione della matrice lineare. La funzione numpy.linalg.lstsq() può essere utilizzata per risolvere l’equazione della matrice lineare AX = B con il metodo dei minimi quadrati in Python. In realtà, è piuttosto semplice. Questa funzione prende le matrici e restituisce la soluzione ai minimi quadrati dell’equazione della matrice lineare sotto forma di un’altra matrice. Vedere il seguente esempio di codice.

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

Produzione:

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

Nel codice sopra, abbiamo calcolato la soluzione dell’equazione della matrice lineare AX = B con la funzione np.linalg.lstsq() in Python. Questo metodo diventa un po’ complicato quando iniziamo ad aggiungere pesi alle nostre matrici. Ci sono due metodi principali che possiamo usare per trovare la soluzione a questo tipo di problema.

La prima soluzione prevede l’utilizzo dell’indicizzazione dell’array con l’identificatore np.newaxis per aggiungere una nuova dimensione ai pesi. È illustrato nell’esempio di codifica riportato di seguito.

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

Produzione:

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

Nel codice sopra, abbiamo calcolato la soluzione dell’equazione della matrice lineare AX = B insieme ai pesi W usando la funzione np.newaxis e np.linalg.lstsq() in Python. Questo metodo funziona bene ma non è molto facile da capire e leggibile.

La seconda soluzione è un po’ più leggibile e facile da capire. Si tratta di trasformare i pesi in una matrice diagonale e quindi utilizzarla. È dimostrato nell’esempio di codifica riportato di seguito.

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

Produzione:

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

Nel codice sopra, abbiamo calcolato la soluzione dell’equazione della matrice lineare AX = B insieme ai pesi W convertendo i pesi in una matrice diagonale e quindi utilizzando la funzione 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