Modellierung#
Lineare Regression#
Lineare Regression zu Fuß#
Gegeben sind zwei numpy Arrays. Die Daten Zeigen das Verhähltnis zwischen Lernzeit und Note für 10 Studentinnen.
Lernzeit = np.array([2,7,11,17,20,22,30,35,39,41])
Note = np.array([5,5,4,3.7,3,3.7,2.7,2,2.3,1])
I. Plotten Sie die Daten auf ein Scatter Plot, wobei die Lernzeit auf der X-Achse und der Note auf der Y-Achse aufgetragen werden sollen.
II. Eine lineare Regression sucht die Gerade, die den quadratischen Abstand aller Messwerte zu jener Gerade minimiert. Folgend sind die beiden Formeln für die Steigung \(m\) und den y-Achsenabschnitt \(b\) der gesuchten Gerade. \(n\) ist die Anzahl der Datenpunkte.
Berechnen Sie mit den gegebenen Daten und mithilfe der beiden Formeln die Gerade.
III. Speichern Sie die berechnete Gerade in einer Funktion und bennenen Sie diese.
Lösung I#
Show code cell source
import numpy as np
import matplotlib.pyplot as plt
Lernzeit = np.array([2,7,11,17,20,22,30,35,39,41])
Note = np.array([5,5,4,3.7,3,3.7,2.7,2,2.3,1])
plt.scatter(Lernzeit,Note)
plt.xlabel('Lernzeit / St')
plt.ylabel('Note')
plt.show()
Lösung II#
Show code cell source
#Steigung
x_summe = np.sum(Lernzeit)
y_summe = np.sum(Note)
xy_summe = np.sum(Lernzeit*Note)
xx_summe = np.sum(Lernzeit**2)
m = ((10*xy_summe)-(x_summe*y_summe))/((10*xx_summe)-(x_summe**2))
print(m)
#Achsenabschnitt
b = (y_summe-m*x_summe)/10
print(b)
Show code cell output
-0.09101666264187402
5.278773243177978
Lösung III#
Show code cell source
# y = m*x + b
def zufuss(Stunden):
return -0.091*Stunden + 5.278
Lineare Regression mit np.polyfit()
#
Berechnen Sie die Koeffizienten \(m\) und \(b\) mithilfe np.polyfit()
.
Lösung#
Show code cell source
polyline = np.polyfit(Lernzeit,Note,1)
polyline
Show code cell output
array([-0.09101666, 5.27877324])
Vergleichen der Lösungswege#
Plotten Sie die Datenpunkte, und beide berechnete Linien mit matplotlib.
Lösung#
Show code cell source
plt.plot(Lernzeit, polyline[0]*Lernzeit + polyline[1], 'r', label='np.polyfit')
plt.plot(Lernzeit, zufuss(Lernzeit), '--y', label='Zufuß')
plt.scatter(Lernzeit, Note, label='Datenpunkte')
plt.xlabel('Lernzeit / St')
plt.ylabel('Note')
plt.legend()
plt.show()
Show code cell output
Schätzung#
Eine Regression erlaubt es, Erwartungswerte für Punkte zu erhalten, für die man keine Daten hat.
Was wäre die erwartete Note einer Studentin, die 25 Stunden gelernt hat?
Lösung#
Show code cell source
print(zufuss(25))
plt.scatter(25, zufuss(25), c='g', label='Prediction')
plt.plot(Lernzeit, polyline[0]*Lernzeit + polyline[1], 'r', label='np.polyfit')
plt.plot(Lernzeit, zufuss(Lernzeit), '--y', label='Zufuß')
plt.scatter(Lernzeit, Note, label='Datenpunkte')
plt.xlabel('Lernzeit / St')
plt.ylabel('Note')
plt.legend()
plt.show()
Show code cell output
3.0029999999999997