In [Teil 1] dieses Artikels (http://qiita.com/kenmatsu4/items/8b4e908d7c93d046110d) finden Sie den Mindestwert, wenn Sie jeweils $ \ alpha $ und $ \ beta $ mit einem bestimmten Wert festlegen. Um jedoch die Parameter $ \ alpha, \ beta $ der ungefähren Geraden (Regressionsgeraden) für diese Daten tatsächlich zu finden, suchen Sie nicht nach dem Fall, in dem $ \ alpha $ und $ \ beta $ gleichzeitig die Mindestwerte haben. Darf nicht sein.
Die in [Teil 1](http://qiita.com/kenmatsu4/items/8b4e908d7c93d046110d#Let's berechne) behandelte Funktion $ S $ kann als Funktion mit zwei Variablen von $ \ alpha $ und $ \ beta $ organisiert werden. Es sieht aus wie.
S(\alpha, \beta) =
\left( \sum_i^n x_i^2 \right) \alpha^2 + n\beta^2
+ 2 \left( \sum_i^n x_i \right)\alpha \beta
- 2 \left( \sum_i^n x_i y_i \right)\alpha
- 2 \left( \sum_i^n y_i \right)\beta
+ \sum_i^n y_i^2
Zusätzlich kann jeder Koeffizient aus den Daten erhalten werden (berechnet in [Teil 1](http://qiita.com/kenmatsu4/items/8b4e908d7c93d046110d#Let's berechne)).
n=50
\left( \sum_i^n x_i^2 \right) =34288
\left( \sum_i^n y_i^2 \right)=11604
\left( \sum_i^n x_iy_i \right)=18884
\left( \sum_i^n x_i \right)=1240
\left( \sum_i^n y_i \right)=655
Und wenn Sie dies ersetzen
S(\alpha, \beta) =
34288 \alpha^2 + 50\beta^2
+ 2480\alpha \beta
- 37768\alpha
- 1310 \beta
+ 11604
Es wird sein. Zeichnen wir einen Graphen dieser quadratischen Kurve. Die vertikale Achse $ S $ ist die Summe der Quadrate des Abstands (Fehlers) zwischen jedem Datenpunkt und der geraden Linie. Finden Sie den Ort, an dem dies der kleinste ist.
from mpl_toolkits.mplot3d.axes3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
# set field
X = np.linspace(0.2, 1.3, 100)
Y = np.linspace(-25, 15, 100)
# set data
#sum(x**2)
sum_x_2 = 34288.2988
#sum(y**2)
sum_y_2 = 11603.8684051
#dot(x,y)
sum_xy = 18884.194896
#sum(x)
sum_x = 1239.7
#sum(y)
sum_y = 655.0152
X, Y = np.meshgrid(X, Y)
#S(α,β)=34288α^2 + 50β^2 + 2480αβ − 37768α − 1310β + 11604
S = (sum_x_2 * (X**2)) + (50 * (Y**2)) + (2 * sum_x * X * Y) + (-2 * sum_xy * X) + (-2 * sum_y * Y) + sum_y_2
# prepare plot
fig = plt.figure(figsize=(18,6))
ax = fig.add_subplot(121, projection='3d', azim=60)
ax.set_xlabel("alpha")
ax.set_ylabel("beta")
ax.set_zlabel("S")
# draw 3D graph
surf = ax.plot_surface(X, Y, S, rstride=1, cstride=1, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
# draw contour
ax = fig.add_subplot(122)
plt.contour(X,Y,S,50)
ax.set_xlabel("alpha")
ax.set_ylabel("beta")
plt.show()
Das 3D-Diagramm links ist etwas verwirrend, aber wenn man das Konturdiagramm rechts betrachtet, liegt der Mindestwert in der Mitte der Ellipse in etwa nahe an dem zuvor visuell vorhergesagten $ \ alpha = 0,74, \ beta = -5 $. Ich werde das machen!
Um es durch Berechnung zu lösen, teilen Sie $ S $ durch $ \ alpha $ bzw. $ \ beta $ und finden Sie den Wert, der zu 0 wird. Wenn $ S $ als Funktion von $ \ alpha $ bzw. $ \ beta $ geschrieben wird, ist dies wie folgt.
S(\alpha) = \left( \sum_i^n x_i^2 \right) \alpha^2
+ 2\left( \sum_i^n (x_i\beta - x_i y_i ) \right) \alpha
+ n\beta^2 - 2\beta\sum_i^n y_i + \sum_i^n y_i^2
S(\beta) = n\beta^2
+ 2 \left( \sum_i^n (x_i\alpha - y_i) \right) \beta
+ \alpha^2\sum_i^n x_i^2 - 2\alpha \sum_i^n x_iy_i + \sum_i^n y_i^2
Da dies teilweise differenziert und auf 0 gesetzt ist,
\frac{\partial S}{\partial \alpha} = 0,
\frac{\partial S}{\partial \beta } = 0,
Löst die simultanen Gleichungen von. Mit anderen Worten
\frac{\partial S}{\partial \alpha} = 2\left(\sum_i^n x_i^2 \right) \alpha + 2\left( \sum_i^n x_i \right) \beta - 2\sum_i^n x_i y_i = 0
\frac{\partial S}{\partial \beta} = 2n\beta + 2\left( \sum_i^n x_i\right) \alpha - 2\sum_i^ny_i = 0
Wird geklärt werden. Ersetzen des aus den Daten erhaltenen Wertes
\frac{1}{2}\frac{\partial S}{\partial \alpha} = 34288 \alpha + 1240 \beta - 18884 = 0
\frac{1}{2}\frac{\partial S}{\partial \beta} = 50 \beta + 1240 \alpha - 655 = 0
Wenn Sie die simultanen Gleichungen mit Python lösen,
from sympy import *
a, b = symbols('a b')
init_printing()
# 34288α + 1240β − 18884 = 0
# 50β + 1240α − 655 = 0
solve([34288 * a + 1240 * b - 18884, 50* b + 1240 * a - 655], [a, b])
a --> 0.746606334842
b --> -5.41583710407
\alpha = 0.746606334842
\beta = -5.41583710407
Sie können die Lösung wie bekommen
Wenn Sie die Werte von $ \ alpha und \ beta $ erneut einsetzen und eine gerade Linie im Streudiagramm zeichnen, ist das Ergebnis wie folgt.
import numpy as np
import matplotlib.pyplot as plt
data= np.loadtxt('cars.csv',delimiter=',',skiprows=1)
data[:,1] = map(lambda x: x * 1.61, data[:,1]) #km von mph/In h konvertieren
data[:,2] = map(lambda y: y * 0.3048, data[:,2]) #Konvertieren Sie von ft nach m
fig = plt.figure(figsize=(10,6))
ax = fig.add_subplot(111)
ax.set_xlim(0,50)
ax.set_title("Stopping Distances of Cars with estimated regression line")
ax.set_xlabel("speed(km/h)")
ax.set_ylabel("distance(m)")
plt.scatter(data[:,1],data[:,2])
x = np.linspace(0,50,50)
y = 0.746606334842 * x -5.41583710407
plt.plot(x,y)
Dies ist die Regressionslinie: Lächeln:
Fortsetzung zur Erklärung mit Animation.
Recommended Posts