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.
・ 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.
Angenommen, Sie haben diese Art von Daten. (Grafik unten) 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.
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()
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. 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. 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()
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