Kleinste Quadrate in NumPy

Muhammad Maisam Abbas 4 Juli 2021
Kleinste Quadrate in NumPy

In diesem Artikel wird vorgestellt, wie man AX = B mit der Methode der kleinsten Quadrate in Python berechnet.

Kleinste Quadrate NumPy mit der Funktion numpy.linalg.lstsq() in Python

Die Gleichung AX = B ist als lineare Matrixgleichung bekannt. Die Funktion numpy.linalg.lstsq() kann verwendet werden, um die lineare Matrixgleichung AX = B mit der Methode der kleinsten Quadrate in Python zu lösen. Eigentlich ist es ziemlich einfach. Diese Funktion nimmt die Matrizen und gibt die Lösung der kleinsten Quadrate der linearen Matrixgleichung in Form einer anderen Matrix zurück. Siehe das folgende Codebeispiel.

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

Ausgabe:

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

Im obigen Code haben wir die Lösung der linearen Matrixgleichung AX = B mit der Funktion np.linalg.lstsq() in Python berechnet. Diese Methode wird ein wenig knifflig, wenn wir beginnen, Gewichte zu unseren Matrizen hinzuzufügen. Es gibt zwei Hauptmethoden, die wir verwenden können, um die Lösung für diese Art von Problem zu finden.

Die erste Lösung besteht darin, die Array-Indizierung mit dem Spezifizierer np.newaxis zu verwenden, um den Gewichtungen eine neue Dimension hinzuzufügen. Dies wird im folgenden Codierungsbeispiel veranschaulicht.

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

Ausgabe:

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

Im obigen Code haben wir die Lösung der linearen Matrixgleichung AX = B zusammen mit den Gewichten W mit der Funktion np.newaxis und np.linalg.lstsq() in Python berechnet. Diese Methode funktioniert gut, ist aber nicht sehr leicht zu verstehen und zu lesen.

Die zweite Lösung ist etwas lesbarer und leicht verständlicher. Dabei werden die Gewichte in eine Diagonalmatrix umgewandelt und dann verwendet. Dies wird im folgenden Codierungsbeispiel gezeigt.

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

Ausgabe:

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

Im obigen Code haben wir die Lösung der linearen Matrixgleichung AX = B zusammen mit den Gewichten W berechnet, indem wir die Gewichte in eine Diagonalmatrix umgerechnet und dann die Funktion np.linalg.lstsq() verwendet haben.

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