Ich versuche, einen guten Überblick über den EM-Algorithmus zu bekommen, um ihn implementieren und verwenden zu können. Ich verbrachte einen ganzen Tag damit, die Theorie und ein Papier zu lesen, in dem EM verwendet wird, um ein Flugzeug unter Verwendung der Positionsinformationen, die von einem Radar kommen, zu verfolgen. Ehrlich gesagt glaube ich nicht, dass ich die zugrunde liegende Idee vollständig verstehe. Kann mich jemand auf ein numerisches Beispiel hinweisen, das einige Iterationen (3-4) der EM für ein einfacheres Problem zeigt (wie das Schätzen der Parameter einer Gaußschen Verteilung oder einer Folge einer Sinusreihe oder das Anpassen einer Linie)?
Selbst wenn mich jemand auf ein Stück Code (mit synthetischen Daten) hinweisen kann, kann ich versuchen, den Code schrittweise durchzugehen.
Antworten:
Dies ist ein Rezept zum Erlernen von EM anhand eines praktischen und (meiner Meinung nach) sehr intuitiven "Coin-Toss" -Beispiels:
Lesen Sie dieses kurze EM-Tutorial von Do und Batzoglou. Dies ist das Schema, in dem das Beispiel für den Münzwurf erklärt wird:
Möglicherweise haben Sie Fragezeichen im Kopf, insbesondere, woher die Wahrscheinlichkeiten im Schritt "Erwartung" stammen. Bitte beachten Sie die Erläuterungen auf dieser Seite zum Austausch von Mathematikstapeln .
Schauen Sie sich diesen Code an, den ich in Python geschrieben habe und der die Lösung des Münzwurfproblems im EM-Tutorialpapier von Punkt 1 simuliert:
quelle
pA_heads[j+1]
undpA_heads[j]
und 2) den Wechsel zwischenpB_heads[j+1]
undpB_heads[j]
. Und es dauert das Maximum der beiden Änderungen. Zum Beispiel, wennDelta_A=0.001
undDelta_B=0.02
, wird die Verbesserung von Schrittj
zu Schrittj+1
sein0.02
.delta
.Es hört sich so an, als ob Ihre Frage zwei Teile hat: die zugrunde liegende Idee und ein konkretes Beispiel. Ich werde mit der zugrunde liegenden Idee beginnen und dann unten auf ein Beispiel verweisen.
EM ist in Catch-22-Situationen nützlich, in denen es den Anschein hat, als müssten Sie kennen, bevor Sie berechnen können, und Sie müssen kennen, bevor Sie berechnen können .B B AA B B A
Der häufigste Fall, mit dem Menschen zu tun haben, sind wahrscheinlich Mischungsverteilungen. Schauen wir uns für unser Beispiel ein einfaches Gaußsches Mischungsmodell an:
Und jetzt steckst du fest:
Wenn Sie die wahren Mittel kennen, können Sie herausfinden, welche Datenpunkte von welchem Gaußschen stammen. Wenn beispielsweise ein Datenpunkt einen sehr hohen Wert hatte, stammte er wahrscheinlich aus der Verteilung mit dem höheren Mittelwert. Aber Sie wissen nicht, was die Mittel sind, also funktioniert das nicht.
Wenn Sie wissen, von welcher Verteilung jeder Punkt stammt, können Sie die Mittelwerte der beiden Verteilungen anhand der Stichprobenmittelwerte der relevanten Punkte schätzen. Sie wissen jedoch nicht genau, welche Punkte Sie welcher Verteilung zuweisen sollen, daher funktioniert dies auch nicht.
Daher scheint keiner der beiden Ansätze zu funktionieren: Sie müssen die Antwort kennen, bevor Sie sie finden können, und Sie stecken fest.
Mit EM können Sie zwischen diesen beiden Schritten wechseln, anstatt den gesamten Prozess auf einmal in Angriff zu nehmen.
Sie müssen mit einer Vermutung über die beiden Mittel beginnen (obwohl Ihre Vermutung nicht unbedingt sehr genau sein muss, müssen Sie irgendwo beginnen).
Wenn Ihre Vermutung über die Mittel zutreffend war, dann hätten Sie genug Informationen, um den Schritt in meinem ersten Aufzählungspunkt oben auszuführen, und Sie könnten (wahrscheinlich) jeden Datenpunkt einem der beiden Gaußschen zuordnen. Auch wenn wir wissen, dass unsere Vermutung falsch ist, versuchen wir es trotzdem. Anhand der zugewiesenen Verteilungen der einzelnen Punkte können Sie dann neue Schätzungen für die Mittelwerte erhalten, die den zweiten Aufzählungspunkt verwenden. Es stellt sich heraus, dass Sie jedes Mal, wenn Sie diese beiden Schritte durchlaufen, eine niedrigere Grenze für die Wahrscheinlichkeit des Modells verbessern.
Das ist schon ziemlich cool: Auch wenn die beiden Vorschläge in den obigen Aufzählungspunkten nicht so aussahen, als würden sie einzeln funktionieren, können Sie sie dennoch zusammen verwenden, um das Modell zu verbessern. Die wahre Magie von EM besteht darin, dass die Untergrenze nach einer ausreichenden Anzahl von Iterationen so hoch ist, dass zwischen ihr und dem lokalen Maximum kein Abstand mehr besteht. Infolgedessen haben Sie die Wahrscheinlichkeit lokal optimiert.
So haben Sie nicht nur verbessern das Modell, haben Sie das gefundenen beste mögliche Modell eines mit inkrementellem Updates finden.
Diese Seite aus Wikipedia zeigt ein etwas komplizierteres Beispiel (zweidimensionale Gaußsche und unbekannte Kovarianz), aber die Grundidee ist dieselbe. Es enthält auch gut kommentierten
R
Code zur Implementierung des Beispiels.Im Code entspricht der Schritt "Erwartung" (E-Schritt) meinem ersten Aufzählungspunkt: Herausfinden, welcher Gauß'sche Wert für jeden Datenpunkt verantwortlich ist, wenn die aktuellen Parameter für jeden Gauß'schen Wert gegeben sind. Der "Maximierungs" -Schritt (M-Schritt) aktualisiert die Mittelwerte und Kovarianzen unter Berücksichtigung dieser Zuordnungen wie in meinem zweiten Aufzählungspunkt.
Wie Sie in der Animation sehen können, ermöglichen diese Aktualisierungen dem Algorithmus, schnell von einer Reihe schrecklicher Schätzungen zu einer Reihe sehr guter zu gelangen: Es scheint tatsächlich zwei Punktwolken zu geben, die auf den beiden von EM gefundenen Gaußschen Verteilungen zentriert sind.
quelle
Hier ist ein Beispiel für die Expectation Maximization (EM), mit der der Mittelwert und die Standardabweichung geschätzt werden. Der Code ist in Python, aber es sollte leicht zu befolgen sein, auch wenn Sie nicht mit der Sprache vertraut sind.
Die Motivation für EM
Die unten gezeigten roten und blauen Punkte stammen aus zwei verschiedenen Normalverteilungen mit jeweils einem bestimmten Mittelwert und einer bestimmten Standardabweichung:
Um vernünftige Annäherungen der "wahren" Mittel- und Standardabweichungsparameter für die Rotverteilung zu berechnen, könnten wir sehr einfach die roten Punkte betrachten und die Position von jedem aufzeichnen und dann die bekannten Formeln verwenden (und ähnlich für die blaue Gruppe) .
Betrachten Sie nun den Fall, in dem wir wissen, dass es zwei Gruppen von Punkten gibt, wir jedoch nicht sehen können, welcher Punkt zu welcher Gruppe gehört. Mit anderen Worten, die Farben sind versteckt:
Es ist überhaupt nicht klar, wie man die Punkte in zwei Gruppen aufteilt. Wir können jetzt nicht nur die Positionen betrachten und Schätzungen für die Parameter der Rotverteilung oder der Blauverteilung berechnen.
Hier kann EM zur Lösung des Problems eingesetzt werden.
Verwenden von EM zum Schätzen von Parametern
Hier ist der Code, der zum Generieren der oben gezeigten Punkte verwendet wird. Sie können die tatsächlichen Mittelwerte und Standardabweichungen der Normalverteilungen sehen, aus denen die Punkte gezogen wurden. Die Variablen
red
undblue
halten die Positionen der einzelnen Punkte in der roten bzw. der blauen Gruppe:Wenn wir die Farbe jedes Punktes sehen könnten , würden wir versuchen, Mittelwerte und Standardabweichungen mithilfe von Bibliotheksfunktionen wiederherzustellen:
Aber da die Farben uns verborgen sind, werden wir den EM-Prozess starten ...
Zuerst raten wir nur die Werte für die Parameter jeder Gruppe ( Schritt 1 ). Diese Vermutungen müssen nicht gut sein:
Ziemlich schlechte Vermutungen - die Mittelwerte sehen so aus, als wären sie weit von einer "Mitte" einer Gruppe von Punkten entfernt.
Um mit EM fortzufahren und diese Vermutungen zu verbessern, berechnen wir die Wahrscheinlichkeit, dass jeder Datenpunkt (unabhängig von seiner geheimen Farbe) unter diesen Vermutungen für den Mittelwert und die Standardabweichung erscheint ( Schritt 2 ).
Die Variable
both_colours
enthält jeden Datenpunkt. Die Funktionstats.norm
berechnet die Wahrscheinlichkeit des Punktes unter Normalverteilung mit den angegebenen Parametern:Dies zeigt uns zum Beispiel, dass der Datenpunkt bei 1,761 nach unseren derzeitigen Schätzungen viel wahrscheinlicher rot (0,189) als blau (0,00003) ist.
Wir können diese beiden Wahrscheinlichkeitswerte in Gewichtungen umwandeln ( Schritt 3 ), sodass sie wie folgt zu 1 summieren:
Mit unseren aktuellen Schätzungen und unseren neu berechneten Gewichten können wir jetzt neue, wahrscheinlich bessere Schätzungen für die Parameter berechnen ( Schritt 4 ). Wir brauchen eine Funktion für den Mittelwert und eine Funktion für die Standardabweichung:
Diese sehen hinsichtlich Mittelwert und Standardabweichung der Daten den üblichen Funktionen sehr ähnlich. Der Unterschied besteht in der Verwendung eines
weight
Parameters, der jedem Datenpunkt eine Gewichtung zuweist.Diese Gewichtung ist der Schlüssel zu EM. Je größer das Gewicht einer Farbe auf einem Datenpunkt ist, desto stärker beeinflusst der Datenpunkt die nächsten Schätzungen für die Parameter dieser Farbe. Letztendlich hat dies den Effekt, dass jeder Parameter in die richtige Richtung gezogen wird.
Die neuen Vermutungen werden mit diesen Funktionen berechnet:
Der EM-Prozess wird dann mit diesen neuen Annahmen ab Schritt 2 wiederholt. Wir können die Schritte für eine bestimmte Anzahl von Iterationen (z. B. 20) wiederholen oder bis die Parameter konvergieren.
Nach fünf Iterationen sehen wir, dass sich unsere anfänglichen Fehleinschätzungen verbessern:
Nach 20 Iterationen ist der EM-Prozess mehr oder weniger konvergiert:
Zum Vergleich werden hier die Ergebnisse des EM-Prozesses mit den berechneten Werten verglichen, bei denen die Farbinformationen nicht verborgen sind:
Hinweis: Diese Antwort wurde von meiner Antwort auf Stack Overflow hier angepasst .
quelle
In Anlehnung an Zhubarbs Antwort habe ich das EM-Beispiel Do und Batzoglou zum "Münzwurf" in GNU R implementiert. Beachten Sie, dass ich die
mle
Funktion desstats4
Pakets verwende - dies hat mir geholfen, den Zusammenhang zwischen EM und MLE besser zu verstehen.quelle
Alle oben genannten Ressourcen sehen großartig aus, aber ich muss auf dieses großartige Beispiel verweisen. Es bietet eine sehr einfache Erklärung für das Ermitteln der Parameter für zwei Linien einer Punktmenge. Das Tutorial wurde von Yair Weiss am MIT erstellt.
http://www.cs.huji.ac.il/~yweiss/emTutorial.pdf
http://www.cs.huji.ac.il/~yweiss/tutorials.html
quelle
Die Antwort von Zhubarb ist großartig, aber leider in Python. Im Folgenden finden Sie eine Java-Implementierung des EM-Algorithmus, der auf demselben Problem ausgeführt wird (siehe Artikel von Do und Batzoglou, 2008). Ich habe einige printf's zur Standardausgabe hinzugefügt, um zu sehen, wie die Parameter konvergieren.
Java-Code folgt unten:
quelle
quelle
Nun, ich würde Ihnen vorschlagen, ein Buch über R von Maria L Rizzo zu lesen. Eines der Kapitel enthält die Verwendung des EM-Algorithmus mit einem numerischen Beispiel. Ich erinnere mich, dass ich den Code zum besseren Verständnis durchgesehen habe.
Versuchen Sie auch, es zu Beginn aus der Sicht eines Clusters zu betrachten. Arbeiten Sie mit der Hand ein Clustering-Problem aus, bei dem 10 Beobachtungen aus zwei verschiedenen Normaldichten entnommen werden. Dies sollte helfen. Nehmen Sie Hilfe von R :)
quelle
Nur für den Fall, ich habe eine Ruby- Implementierung des oben erwähnten Münzwurf-Beispiels von Do & Batzoglou geschrieben und es erzeugt genau die gleichen Zahlen wie sie mit den gleichen Eingabeparametern und . θ B = 0,5θA=0.6 θB=0.5
quelle