Verwenden Sie den folgenden kleinen Datensatz:
bill = [34,108,64,88,99,51]
tip = [5,17,11,8,14,5]
Ich habe eine am besten passende Regressionslinie (von Hand) berechnet.
yi = 0.1462*x - 0.8188 #yi = slope(x) + intercept
Ich habe meine Originaldaten mit Matplotlib folgendermaßen gezeichnet:
scatter(bill,tip, color="black")
plt.xlim(20,120) #set ranges
plt.ylim(4,18)
#plot centroid point (mean of each variable (74,10))
line1 = plt.plot([74, 74],[0,10], ':', c="red")
line2 = plt.plot([0,74],[10,10],':', c="red")
plt.scatter(74,10, c="red")
#annotate the centroid point
plt.annotate('centroid (74,10)', xy=(74.1,10), xytext=(81,9),
arrowprops=dict(facecolor="black", shrink=0.01),
)
#label axes
xlabel("Bill amount ($)")
ylabel("Tip amount ($)")
#display plot
plt.show()
Ich bin nicht sicher, wie die Regressionslinie in die Handlung selbst eingefügt wird. Ich bin mir bewusst, dass es eine Menge eingebauter Sachen für das schnelle Anpassen und Anzeigen von Best-Fit-Linien gibt, aber ich habe das als Übung getan. Ich weiß, dass ich die Linie an den Punkten '0,0.8188' (dem Achsenabschnitt) starten kann, aber ich weiß nicht, wie ich den Neigungswert verwenden soll, um die Linie zu vervollständigen (die Endpunkte der Linien festlegen).
In Anbetracht der Tatsache, dass die Steigung für jeden Anstieg auf der x-Achse um '0,1462' zunehmen sollte; für die Linienkoordinaten habe ich versucht (0,0.8188) für den Startpunkt und (100,14.62) für den Endpunkt. Diese Linie verläuft jedoch nicht durch meinen Schwerpunkt. Es vermisst es einfach.
Prost, Jon
Die Begründung in der Frage ist teilweise richtig. Mit einer Funktion f(x) = a*x +b
können Sie als erstes den Abfang mit der y-Achse (x = 0) als (0, b)
(oder in diesem Fall (0,-0.8188)
) nehmen.
Jeder andere Punkt in dieser Zeile wird durch (x, f(x))
oder (x, a*x+b)
angegeben. Wenn Sie sich den Punkt bei x = 100 anschauen, würden Sie (100, f(100))
sehen und Folgendes einstecken: (100, 0.1462*100-0.8188)
= (100,13.8012)
. Falls Sie in der Frage beschrieben haben, dass Sie gerade vergessen haben, die b
zu berücksichtigen.
Im Folgenden wird gezeigt, wie Sie mit dieser Funktion die Linie in matplotlib zeichnen können:
import matplotlib.pyplot as plt
import numpy as np
bill = [34,108,64,88,99,51]
tip = [5,17,11,8,14,5]
plt.scatter(bill, tip)
#fit function
f = lambda x: 0.1462*x - 0.8188
# x values of line to plot
x = np.array([0,100])
# plot fit
plt.plot(x,f(x),lw=2.5, c="k",label="fit line between 0 and 100")
#better take min and max of x values
x = np.array([min(bill),max(bill)])
plt.plot(x,f(x), c="orange", label="fit line between min and max")
plt.legend()
plt.show()
Natürlich kann die Anpassung auch automatisch erfolgen. Sie können die Steigung und den Schnittpunkt von einem Aufruf an numpy.polyfit
erhalten:
#fit function
a, b = np.polyfit(np.array(bill), np.array(tip), deg=1)
f = lambda x: a*x + b
Der Rest in der Handlung würde gleich bleiben.
funktionsanpassung definieren, Endpunkte von Daten abrufen, Tupel in plot () einfügen
def fit(x):
return 0.1462*x - 0.8188 #yi = slope(x) - intercept
xfit, yfit = (min(bill), max(bill)), (fit(min(bill)), fit(max(bill)))
plt.plot(xfit, yfit,'b')
kurze Anmerkung: Ich denke, dass die Formel für die Regression sein sollte
return 0.1462*x + 0.8188 #yi = slope(x) + intercept
Ich meine + statt -.