wake-up-neo.net

Python/Matplotlib: Hinzufügen einer Regressionslinie zu einem Diagramm aufgrund seines Abschnitts und seiner Neigung

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

5
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()

 enter image description here

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')
1
f5r5e5d

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 -.

0
Enzo Calogero