In diesem Blog wird es sehr mathematisch. Wir werden eine Menge ableiten und herleiten. Wenn Du also Freude am Formelnreiten hast, solltest Du Dich an die gute alte Zeit aus dem Mathe LK erinnert fĂŒhlen. Mir hat diese FingerĂŒbung so viel SpaĂ bereitet, dass ich beschlossen habe, diesen kleinen Blog zu schreiben.
Die Normalverteilung
Maschinelles Lernen braucht viele Daten, um den richtigen Algorithmus erlernen zu können. Wenn man zum Beispiel ein ML Verfahren entwickelt, dass das Wetter der nĂ€chsten Tage bestimmen soll, braucht man möglichst viele Messwerte (Datum, Temperatur, Feuchtigkeit, Luftdruck, âŠ) aus der Vergangenheit. NatĂŒrlich darf man den Daten, mit denen man seinen Algorithmus fĂŒttert, nicht blind vertrauen. Man muss sich auf jeden Fall seiner QualitĂ€t vergewissern, um nicht etwas Falsches zu lernen. Da man sich zumeist nicht jeden Datensatz einzeln anschauen kann, verwendet man statistische Verfahren, um etwaige AusreiĂer und Fehler herausfiltern zu können.
Die Normalverteilung ist eins der wesentlichen Werkzeuge der Analysten. Wenn man die QualitĂ€t der Daten bestimmen möchte, mit denen man einen Algorithmus fĂŒr maschinelles Lernen (Random Forest, Neuronale Netze, âŠ) fĂŒttert, ist die Normalverteilung ein absolutes Grundwerkzeug. Dabei geht es darum, einen Ausdruck zu finden, wie wahrscheinlich ein durchschnittliches Ergebnis ist. Eine Frau in Deutschland ist zum Beispiel durchschnittlich 1,66m groĂ. Aber natĂŒrlich sind nicht alle Frauen in Deutschland 1,66m groĂ. Die Normalverteilung kann fĂŒr diesen Fall eine quantitative Aussage treffen, wie groĂ die Wahrscheinlichkeit ist, dass die nĂ€chste Frau, die Du siehst 1,66m, 1,80m oder 1,25m groĂ ist. Die Normalverteilung gehorcht dabei folgender Gleichung.
Die FlĂ€che unter dieser Funktion ist immer 1. Somit eignet sie sich eben perfekt fĂŒr die Analyse von Stichproben, da die absolute Menge der Proben immer auf 1 normiert wird.
Ich möchte mich auf die beiden Formfaktoren Ï und ÎŒ der Gleichung konzentrieren, die die allgemeine Normalverteilung auf jede spezielle Stichprobe anpasst. Im Folgenden werde ich Schritt fĂŒr Schritt herleiten, wie man aus einer Menge von Messungen (zum Beispiel die KörpergröĂe von einhundert Frauen in Deutschland) die beiden Faktoren herleitet.
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import math
x = np.arange(-5, 5, 0.1)
y = [1 / math.sqrt(2 * math.pi) * math.exp(-0.5 * x**2) for x in x]
plt.plot(x,y, label="Ï = 1 / ” = 0")
plt.grid(True)
plt.legend()
plt.show()
print("Abb 1: Normalverteilung fĂŒr Ï = 1 und ” = 0")
Abb 2: Normalverteilung fĂŒr Ï = 1 und ” = 0
Formfaktor: ? der Erwartungswert
Der Erwartungswert ist schlichtweg der Mittelwert. Damit verschiebt man das Maximum der Kurve auf den Durchschnittswert.
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import math
x = np.arange(130, 210, 0.1)
y_klein = [1 / math.sqrt(2 * math.pi) * math.exp(-0.5 * (x - 140)**2) for x in x]
y_mittel = [1 / math.sqrt(2 * math.pi) * math.exp(-0.5 * (x - 166)**2) for x in x]
y_gross = [1 / math.sqrt(2 * math.pi) * math.exp(-0.5 * (x - 180)**2) for x in x]
plt.plot(x,y_klein, label="” = 140cm")
plt.plot(x,y_mittel, label="” = 166cm")
plt.plot(x,y_gross, label="” = 180cm")
plt.grid(True)
plt.legend()
plt.show()
print("Abb 2: Normalverteilung fĂŒr Ï = 1 und ” = 140cm oder 166cm oder 180cm")
Formfaktor: ? die Varianz
Die Varianz gibt an, wie stark die Proben um den Mittelwert streuen. Wenn eine Schulklasse zum Beispiel eine Arbeit schreibt und 15 Kinder eine Eins und 15 Kinder eine Sechs schreiben, ist der Mittelwert eine 3, die Streuung ist aber extrem groĂ.
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import math
x = np.arange(-5, 5, 0.1)
y_klein = [1 / math.sqrt(2 * math.pi * 0.5**2) * math.exp(-0.5 * (x)**2 / 0.5**2) for x in x]
y_mittel = [1 / math.sqrt(2 * math.pi * 1.0**2) * math.exp(-0.5 * (x)**2 / 1.0**2) for x in x]
y_gross = [1 / math.sqrt(2 * math.pi * 2.0**2) * math.exp(-0.5 * (x)**2 / 2.0**2) for x in x]
plt.plot(x,y_klein, label="Ï = 0,5")
plt.plot(x,y_mittel, label="Ï = 1.0")
plt.plot(x,y_gross, label="Ï = 2.0")
plt.grid(True)
plt.legend()
plt.show()
print("Abb 3: Normalverteilung fĂŒr ” = 0 und Ï = 0,5 oder Ï = 1.0 oder Ï = 2,0")
Ein Beispiel
Nehmen wir noch einmal die DurchschnittsgröĂe von Frauen in Deutschland. Laut www.laenderdaten.info ist sie 1,66m. Ich schĂ€tze nun ein Ï von 12 und errechne die Wahrscheinlichkeit, dass ich als nĂ€chstes eine Frau mit 1,40m oder 1,66m oder 1,90m treffe.
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import math
sigma = 12
mu = 166
f = lambda x : 1 / math.sqrt(2 * math.pi * sigma**2) * math.exp(-0.5 * (x - mu)**2 / sigma**2)
x = np.arange(100, 220, 0.1)
y = [f(x) for x in x]
plt.plot(x,y, label="Ï = 12 / ” = 166")
h = 140
plt.plot(h, f(h),'o-', label="{}cm = {:.2f}%".format(h, f(h)*100))
h = 166
plt.plot(h, f(h),'o-', label="{}cm = {:.2f}%".format(h, f(h)*100))
h = 190
plt.plot(h, f(h),'o-', label="{}cm = {:.2f}%".format(h, f(h)*100))
plt.grid(True)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)
plt.show()
print("Abb 4: Normalverteilte KörpergröĂen von Frauen in Deutschland mit einem ” = 166cm und Ï = 12")
Die Wahrscheinlichkeit, dass ich alle drei Frauen als nÀchstes treffe ist somit das Produkt aus den Einzelergebnissen:
Herleitung der Formfaktoren
Das Produkt
Nun stellt sich die Frage: Wie kann man aus einer Menge von Testergebnissen die beiden Formfaktoren Ï und ÎŒ herleiten? Dazu gehe ich noch einmal zurĂŒck zum Beispiel, in dem man sehen kann, dass die Gesamtwahrscheinlichkeit das Produkt der Einzelwahrscheinlichkeiten ist:
Wichtig ist hier, dass alle xi aus demselben Wahrscheinlichkeitsexperiment kommen mĂŒssen. Sie haben also alle das gleiche ÎŒ und das gleiche Ï.
Der Logarithmus
Man kann sich vergegenwĂ€rtigen, dass sich ÎŒ und Ï gegenseitig nicht beeinflussen. Das ÎŒ verschiebt das Maximum der Kurve nach links oder rechts und das Ï bestimmt die Höhe und die Breite der Kurve. Beide Parameter sind also voneinander entkoppelt und können einzeln betrachtet werden. Das gilt, solange alle xi aus dem gleichen Wahrscheinlichkeitsexperiment kommen und somit das gleiche ÎŒ und Ï haben. Diese VorĂŒberlegung fĂŒhrt zum nĂ€chsten Schritt. Ich will wissen, wo das ÎŒ maximal wird. Dazu mĂŒsste ich die Funktion nach ÎŒ ableiten:
Das kann man machen ist wegen des Produkts der einzelnen xi aber nicht sehr lustig. Man kann hier aber zu einem kleinen Trick greifen. Wir suchen ja den Ort des Maximums, und nicht den Betrag. Also können wir uns eine Funktion suchen, die ihr Maximum an der gleichen Stelle hat, die sich aber schöner ableiten lÀsst. Und die gibt es. Wir nehmen einfach von dem gesamten Ausdruck den Logarithmus:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import math
sigma = 2
x = 144
f = lambda mu : 1 / math.sqrt(2 * math.pi * sigma**2) * math.exp(-0.5 * (x - mu)**2 / sigma**2)
f_ln = lambda mu : math.log(1 / math.sqrt(2 * math.pi * sigma**2) * math.exp(-0.5 * (x - mu)**2 / sigma**2))
mu = np.arange(100, 220, 0.1)
plt.plot(mu, [f(mu_i) for mu_i in mu], label="W(”,Ï,x)")
plt.plot(mu, [f_ln(mu_i) for mu_i in mu], label="ln(W(”,Ï,x))")
plt.yscale('symlog', linthreshy=0.01)
plt.grid(True)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)
plt.show()
print("Abb 5: Normalverteilung und deren natĂŒrlicher Logarithmus fĂŒr ein konstantes Ï und x")
Der Logarithmus hat die schöne Eigenschaft, dass er alle Rechenoperationen quasi um einen Grad heruntersetzt. Somit können wir den Ausdruck oben in sehr einfache Teile zerlegen:
Die Kettenregel
Mit der Kettenregel lĂ€sst sich der Ausdruck nun sehr einfach nach ÎŒ ableiten:
Das Maximum
Das Maximum einer Funktion findet man bekanntlich, indem man sie einmal ableitet und zu null setzt:
Die Formel fĂŒr den Erwartungswert ÎŒ ist also der Mittelwert aller Einzelwahrscheinlichkeiten und das ist ja auch genau das Ergebnis, dass wir erwartet haben.
Der nÀchste Parameter
Nun stellt sich die Frage, ob man den Logarithmus auch fĂŒr die Herleitung der Varianz verwenden kann. Da wir oben aber festgestellt haben, dass die Parameter voneinander entkoppelt sind sollte auch das funktionieren.
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import math
mu = 166
x = 144
f = lambda sigma : 1 / math.sqrt(2 * math.pi * sigma**2) * math.exp(-0.5 * (x - mu)**2 / sigma**2)
f_ln = lambda sigma : math.log(1 / math.sqrt(2 * math.pi * sigma**2) * math.exp(-0.5 * (x - mu)**2 / sigma**2))
sigma = np.arange(1.9, 250, 0.1)
plt.plot(sigma, [f(sigma_i) for sigma_i in sigma], label="W(”,Ï,x)")
plt.plot(sigma, [f_ln(sigma_i) for sigma_i in sigma], label="ln(W(”,Ï,x))")
plt.yscale('symlog', linthreshy=0.01)
plt.grid(True)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0.)
plt.show()
print("Abb 6: Normalverteilung und deren natĂŒrlicher Logarithmus fĂŒr ein konstantes ” und x")
Eine visuelle Inspektion ist ja bekanntlich kein Beweis, dass man auch hier den Logarithmus verwenden kann, um die Varianz herzuleiten. Somit glauben wir erst einmal der Behauptung, dass beide Kurven ihr Maximum an der gleichen Stelle haben und ĂŒberprĂŒfen, ob das Ergebnis plausibel erscheint:
Simples Ableiten
Das Maximum
Auch diese Gleichung wird wieder zu null gesetzt:
Diese Formel kennt man als Statistiker auch. Das ist nĂ€mlich die Standartabweichung. Also ein MaĂ fĂŒr die Streuung von Stichproben um den Mittelwert. Damit sind die wichtigsten Werkzeuge fĂŒr die Bewertung von Stichproben geschĂ€rft:
Keine Kommentare vorhanden.