Ich habe die Methode der kleinsten Quadrate in Python ausprobiert

Einführung

Vielen Dank. Dieses Mal habe ich einen Artikel darüber geschrieben, wie man die Methode der kleinsten Quadrate in Python implementiert. Wie ich bereits erwähnt habe, weiß ich nicht, ob ich nicht über die folgenden mathematischen Kenntnisse verfüge.

Notwendiges Wissen

・ Grundfunktionen wie lineare und quadratische Funktionen ・ Differenzierung und partielle Differenzierung ・ Gesamtzahl (Σ), Durchschnitt

Wenn Sie bis zur High School Mathematikkenntnisse haben, sollte es kein Problem geben. Mal sehen, wie es aussieht.

Was ist die Methode der kleinsten Quadrate?

Angenommen, Sie haben diese Art von Daten. (Grafik unten) data_least_squares_method.png Es ist unmöglich zu sagen: "Zeichnen Sie eine lineare Funktion, die den Fehler von jedem Punkt aus minimiert." Die Methode, die dies ermöglicht, ist die ** Minimum-Square-Methode (Minimum-Square-Methode) **. Es kann verwendet werden, wenn die Messdaten $ y $ die Summe der Modellfunktion (ursprüngliche Funktion) $ f (x) $ und des Fehlers $ \ varepsilon $ sind. Es wird wie folgt ausgedrückt.

y = f(x) + \varepsilon

Dies bedeutet, dass Sie die Methode der kleinsten Quadrate nicht mit zufälligen Daten verwenden können.

Da diese Daten nun in der Lage zu sein scheinen, eine lineare Funktion zu approximieren, wollen wir sie als Modellfunktion approximieren. Die Formel der linearen Funktion lautet wie folgt.

f(x) = ax + b

Finden Sie die geeigneten Parameter für $ a $ und $ b $ mit der Methode der kleinsten Quadrate. Ermitteln Sie zunächst die Summe der Quadrate der Differenz zwischen den tatsächlichen Daten, bei denen es sich auch um den Namen handelt, und der Modellfunktion. Die Formel lautet wie folgt.

J=\sum_{i=1}^n(y_i-f(x_i))^2=\sum_{i=1}^n(y_i-ax_i-b)^2

Der Grund für das Finden des Quadrats des Fehlers besteht darin, es wie eine quadratische Funktion zu verhindern, da sich sowohl positive als auch negative Fehler gegenseitig aufheben und nicht genau gefunden werden können.

Die Summe der Fehlerquadrate $ J $ wird teilweise durch $ a $ und $ b $ unterschieden. Die teilweise Differenzierung ist wie folgt.

\frac{\partial J}{\partial a}=-2\sum_{i=1}^nx_i(y_i-ax_i-b)=-2(\sum_{i=1}^n x_iy_i - a\sum_{i=1}^n x_i^2 - b\sum_{i=1}^n x_i)\tag{1}
\frac{\partial J}{\partial b}=-2\sum_{i=1}^n(y_i-ax_i-b)=-2(\sum_{i=1}^n y_i - a\sum_{i=1}^n x_i - nb)\tag{2}

Finden Sie $ a $ und $ b $, wenn diese beiden Gleichungen 0 sind. Transformieren Sie zunächst Gleichung (2) in eine Gleichung von $ b = $.

b=\frac{1}{n}\sum_{i=1}^n y_i - \frac{a}{n}\sum_{i=1}^n x_i\tag{3}

Setzen Sie Gleichung (3) in Gleichung (1) ein und lassen Sie nur $ a $ als Variable für $ a = $.

a=\frac{n\sum_{i=1}^n x_iy_i-\sum_{i=1}^n x_i \sum_{i=1}^n y_i}{n\sum_{i=1}^n x_i^2-(\sum_{i=1}^n x_i)^2}

Danach können Sie dies in Gleichung (3) einsetzen, um die Parameter von $ a $ und $ b $ zu finden ... aber Σ ist zu viel und es ist durcheinander. Lassen Sie uns die Buchstaben so platzieren, dass sie etwas leichter zu sehen sind.

a=\frac{nXY_{sum}-X_{sum}Y_{sum}}{nX^2_{sum}-(X_{sum})^2}\tag{4}
b=Y_{ave}-aX_{ave}\tag{5}

Wie wär es damit. Ist es etwas leichter zu sehen? Die Buchstaben haben folgende Bedeutung.

Übrigens, wenn Sie das Molekül und den Nenner von Gleichung (4) durch $ n ^ 2 $ teilen, können Sie sie auch alle durch den Durchschnitt von jedem finden.

a=\frac{XY_{ave}-X_{ave}Y_{ave}}{X^2_{ave}-(X_{ave})^2}\tag{6}

Nachdem wir das Prinzip kennen, berechnen wir mit Python.

In Python implementiert

Für die Daten haben wir die Daten aus dem zuerst gezeigten Diagramm verwendet. Der Quellcode wird unten angezeigt. Zusätzlich wurde ** numpy ** für die numerische Berechnung verwendet.

import numpy as np
import matplotlib.pyplot as plt

#Zu verwendende Daten
X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
Y = np.array([2, 5, 3, 7, 12, 11, 15, 16, 19])

plt.scatter(X, Y, color = 'red')

#Anzahl der Daten
n = Y.size

#Produkt von X und Y.
XY = X * Y

#Quadrat jedes Elements von X.
X_2 = X * X

#Ableitung von Parametern
a = (n * np.sum(XY) - np.sum(X) * np.sum(Y)) / (n * np.sum(X_2) - (np.sum(X)**2))
b = np.average(Y) - a * np.average(X)

print('a', a)
print('b', b)

Y = a * X + b

plt.plot(X, Y)

plt.show()

Ausführungsergebnis

Die Ergebnisausgabe an den Befehl ist unten dargestellt.

a 2.15
b -0.75

Es scheint, dass die Steigung 2,15 und der Abschnitt -0,75 beträgt. Die Grafik ist auch unten dargestellt. Circumference1.png Wie Sie sehen, konnte ich eine lineare Funktion gut zeichnen. Die Fehleränderung kann übrigens als Zwei-Variablen-Funktion von $ J (a, b) $ ausgedrückt werden. Das 3D-Diagramm ist unten dargestellt. Circumference2.png Die roten Punktkoordinaten $ (x, y, z) = (2.15, -0.75, 16.6) $ geben die diesmal erhaltenen Werte von $ a $ und $ b $ und den Wert des Fehlers $ J $ an. Wie Sie in der Grafik sehen können, ist diese Koordinate der Mindestwert. Vorerst werde ich den Quellcode veröffentlichen, also führen Sie ihn aus und überzeugen Sie sich selbst.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)

#Definition der J-Funktion
def Er(a, b, y_2, xy, y, x_2, x, n):
    return y_2-2*a*xy-2*b*y+a**2*x_2+2*a*b*x+n*b**2

#Zu verwendende Daten
X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
Y = np.array([2, 5, 3, 7, 12, 11, 15, 16, 19])

#Anzahl der Daten
n = Y.size

#Produkt von X und Y.
XY = X * Y

#Quadrat jedes Elements von X.
X_2 = X * X

#Ableitung von Parametern
a = (n * np.sum(XY) - np.sum(X) * np.sum(Y)) / (n * np.sum(X_2) - (np.sum(X)**2))
b = np.average(Y) - a * np.average(X)

print(a)
print(b)

A = np.arange(a, a+0.1, 0.00001)
B = np.arange(b, b+0.1, 0.00001)

A, B = np.meshgrid(A, B)
J = Er(A, B, np.sum(Y*Y), np.sum(XY), np.sum(Y), np.sum(X_2), np.sum(X), n)

ax.plot_wireframe(A, B, J)

j = Er(a, b, np.sum(Y*Y), np.sum(XY), np.sum(Y), np.sum(X_2), np.sum(X), n)
print(j)
ax.scatter(a, b, j, color='red')

ax.set_xlabel("A")
ax.set_ylabel("B")
ax.set_zlabel("J")

plt.show()

Zusammenfassung

Diesmal war es eine Geschichte, in der ich versucht habe, die Methode der kleinsten Quadrate in Python zu implementieren. Die Methode der kleinsten Quadrate ist eine der Statistiken und ein notwendiges Feld für das Studium der KI. Ich studiere gerade, also werde ich es als Memo hinterlassen. Wenn Sie Fragen haben, hinterlassen Sie bitte einen Kommentar.

Recommended Posts

Ich habe die Methode der kleinsten Quadrate in Python ausprobiert
Ich habe versucht, "Birthday Paradox" mit Python zu simulieren
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Beachten Sie, dass ich den Algorithmus der kleinsten Quadrate verstehe. Und ich habe es in Python geschrieben.
Ich habe die Warteschlange in Python geschrieben
Ich habe Line Benachrichtigung in Python versucht
Ich habe den Stack in Python geschrieben
Ich habe versucht "Wie man eine Methode in Python dekoriert"
Ich habe versucht, den Chi-Quadrat-Test in Python und Java zu programmieren.
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Approximieren Sie eine Bezier-Kurve durch einen bestimmten Punkt mit der Methode der kleinsten Quadrate in Python
Ich habe versucht, Permutation in Python zu implementieren
Ich habe versucht, PLSA in Python 2 zu implementieren
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe versucht, PPO in Python zu implementieren
Python: Ich habe das Problem des Handlungsreisenden ausprobiert
Ich habe das Python Tornado Testing Framework ausprobiert
Ich habe die Bewegung Python3 ausprobiert, die die Richtung im Koordinatensystem ändert
Ich habe einen AttributeError erhalten, als ich die offene Methode in Python verspottet habe
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
[Python] Ich habe versucht, den Funktionsnamen durch den Funktionsnamen zu ersetzen
[Python] Ich habe versucht, den kollektiven Typ (Satz) auf leicht verständliche Weise zusammenzufassen.
vprof - Ich habe versucht, den Profiler für Python zu verwenden
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Lernen Sie das Entwurfsmuster "Vorlagenmethode" in Python
Ich habe versucht, mit Python ein Tippspiel zu spielen
Ich habe Python> autopep8 ausprobiert
Dynamisches Ersetzen der nächsten Methode in Python
Lernen Sie das Entwurfsmuster "Factory Method" in Python
Ich habe zum ersten Mal versucht, Python zu programmieren.
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, TOPIC MODEL in Python zu implementieren
Simplex-Methode (Einzelmethode) in Python
Ich habe versucht, das Datetime-Modul von Python zu verwenden
Ich habe versucht, das Verhalten von E / A-Eventlets in Python nicht zu blockieren
Private Methode in Python
Ich habe versucht, die inverse Gammafunktion in Python zu implementieren
Ich habe versucht, ein Python 3-Modul in C hinzuzufügen
Ich habe eine fraktale Dimensionsanalyse mit der Box-Count-Methode in 3 Dimensionen versucht
Ich habe versucht, eine selektive Sortierung in Python zu implementieren
Ich habe Python> Decorator ausprobiert
Versuchen Sie, die Monte-Carlo-Methode in Python zu implementieren
Ich möchte den Fortschritt in Python anzeigen!
Ich habe Python zum ersten Mal auf dem Mac ausprobiert.
Ich habe versucht, TradeWave zu verwenden (BitCoin-Systemhandel in Python)
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Bestimmen Sie den Schwellenwert mithilfe der P-Tile-Methode in Python
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Ich habe Python zum ersten Mal mit Heroku ausprobiert
Ich habe versucht, Drakues Poker in Python zu implementieren
Ich habe versucht, EKG-Daten mit der K-Shape-Methode zu gruppieren
Ich habe versucht, GA (genetischer Algorithmus) in Python zu implementieren
[Python] Ich habe versucht, die Top 10 der Lidschatten grafisch darzustellen
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich habe versucht zusammenzufassen, wie man Pandas von Python benutzt
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, die Methode zur Mittelung der Dollarkosten zu simulieren