Staram się dobrze zrozumieć algorytm EM, aby móc go wdrożyć i używać. Spędziłem cały dzień czytając teorię i artykuł, w którym EM służy do śledzenia samolotu z wykorzystaniem informacji o położeniu pochodzących z radaru. Szczerze mówiąc, nie sądzę, że w pełni rozumiem leżącą u podstaw ideę. Czy ktoś może wskazać mi numeryczny przykład pokazujący kilka iteracji EM (3–4) dla prostszego problemu (np. Oszacowanie parametrów rozkładu Gaussa lub sekwencji szeregu sinusoidalnego lub dopasowanie linii).
Nawet jeśli ktoś może wskazać mi fragment kodu (z danymi syntetycznymi), mogę spróbować przejść przez kod.
Odpowiedzi:
To jest przepis na naukę EM z praktycznym i (moim zdaniem) bardzo intuicyjnym przykładem „Rzut monetą”:
Przeczytaj ten krótki samouczek EM autorstwa Do i Batzoglou. Oto schemat, w którym wyjaśniono przykład rzucania monetą:
Możesz mieć w głowie znaki zapytania, szczególnie jeśli chodzi o to, skąd pochodzą prawdopodobieństwa na etapie Oczekiwania. Proszę spojrzeć na wyjaśnienia na tej stronie wymiany stosów matematycznych .
Spójrz na / uruchom ten kod, który napisałem w Pythonie, który symuluje rozwiązanie problemu rzucania monetą w dokumencie instruktażowym EM w punkcie 1:
źródło
pA_heads[j+1]
ipA_heads[j]
oraz 2) zmiany pomiędzypB_heads[j+1]
ipB_heads[j]
. I zajmuje to maksymalnie dwie zmiany. Na przykład, jeśliDelta_A=0.001
iDelta_B=0.02
, poprawa od krokuj
doj+1
będzie0.02
.delta
.Wygląda na to, że twoje pytanie składa się z dwóch części: idei i konkretnego przykładu. Zacznę od idei leżącej u podstaw, a następnie link do przykładu na dole.
Najczęstszym przypadkiem, z którym ludzie mają do czynienia, jest prawdopodobnie rozkład mieszanin. W naszym przykładzie spójrzmy na prosty model mieszanki Gaussa:
A teraz utknąłeś:
Jeśli znasz prawdziwe środki, możesz dowiedzieć się, które punkty danych pochodzą z którego Gaussa. Na przykład, jeśli punkt danych miał bardzo wysoką wartość, prawdopodobnie pochodzi on z rozkładu o wyższej średniej. Ale nie wiesz, jakie są środki, więc to nie zadziała.
Gdybyście wiedzieli, z którego rozkładu pochodzi każdy punkt, moglibyście oszacować te dwa rozkłady za pomocą średnich próbek odpowiednich punktów. Ale tak naprawdę nie wiesz, które punkty przypisać do której dystrybucji, więc to też nie zadziała.
Żadne podejście nie wydaje się więc skuteczne: musisz znać odpowiedź, zanim znajdziesz odpowiedź, i utkniesz.
EM pozwala ci na zmianę na przemian między tymi dwoma wykonalnymi krokami, zamiast zajmować się całym procesem naraz.
Musisz zacząć od zgadywania na temat dwóch środków (chociaż twoje przypuszczenie niekoniecznie musi być bardzo dokładne, musisz gdzieś zacząć).
Jeśli twoje przypuszczenia na temat średnich były dokładne, miałbyś wystarczającą ilość informacji, aby wykonać krok w moim pierwszym punkcie powyżej, i możesz (probabilistycznie) przypisać każdy punkt danych do jednego z dwóch Gaussów. Chociaż wiemy, że nasze domysły są błędne, spróbujmy mimo to. A następnie, biorąc pod uwagę przypisane rozkłady każdego punktu, możesz uzyskać nowe oszacowania średnich za pomocą drugiego punktu. Okazuje się, że za każdym razem, gdy wykonujesz pętlę przez te dwa kroki, poprawiasz dolną granicę prawdopodobieństwa modelu.
To już całkiem fajne: chociaż dwie sugestie w punktach powyżej nie wyglądały tak, jakby działały indywidualnie, nadal możesz je wykorzystać razem, aby ulepszyć model. Prawdziwa magia EM jest to, że po tyle powtórzeń, dolna granica będzie tak wysoka, że nie będzie żadnych przestrzeń między nią a lokalnym maksimum. W rezultacie lokalnie zoptymalizowałeś prawdopodobieństwo.
Więc nie tylko ulepszyłeś model, ale znalazłeś najlepszy możliwy model, jaki można znaleźć dzięki aktualizacjom przyrostowym.
Ta strona z Wikipedii pokazuje nieco bardziej skomplikowany przykład (dwuwymiarowe Gaussianie i nieznana kowariancja), ale podstawowa idea jest taka sama. Zawiera również dobrze skomentowany
R
kod do implementacji przykładu.W kodzie krok „Oczekiwanie” (krok E) odpowiada mojemu pierwszemu punktowi: ustalenie, który Gaussian bierze odpowiedzialność za każdy punkt danych, biorąc pod uwagę bieżące parametry dla każdego Gaussa. Krok „Maksymalizacja” (krok M) aktualizuje środki i kowariancje, biorąc pod uwagę te zadania, jak w moim drugim punkcie.
Jak widać na animacji, te aktualizacje szybko pozwalają algorytmowi przejść od zestawu okropnych oszacowań do zestawu bardzo dobrych: naprawdę wydaje się, że istnieją dwie chmury punktów wyśrodkowane na dwóch rozkładach Gaussa, które znajdzie EM.
źródło
Oto przykład metody Expectation Maximization (EM) zastosowanej do oszacowania średniej i odchylenia standardowego. Kod jest w języku Python, ale powinien być łatwy do naśladowania, nawet jeśli nie znasz języka.
Motywacja do EM
Przedstawione poniżej czerwone i niebieskie punkty pochodzą z dwóch różnych rozkładów normalnych, z których każdy ma określoną średnią i standardowe odchylenie:
Aby obliczyć rozsądne aproksymacje „prawdziwych” średnich i standardowych parametrów odchylenia dla rozkładu czerwonego, możemy bardzo łatwo spojrzeć na czerwone punkty i zapisać położenie każdego z nich, a następnie użyć znanych wzorów (i podobnie dla grupy niebieskiej) .
Rozważmy teraz przypadek, w którym wiemy, że istnieją dwie grupy punktów, ale nie widzimy, który punkt należy do której grupy. Innymi słowy, kolory są ukryte:
Nie jest wcale oczywiste, jak podzielić punkty na dwie grupy. Nie jesteśmy teraz w stanie spojrzeć na pozycje i obliczyć oszacowań parametrów rozkładu czerwonego lub niebieskiego.
Tutaj EM można wykorzystać do rozwiązania problemu.
Wykorzystanie EM do oszacowania parametrów
Oto kod używany do generowania punktów pokazanych powyżej. Możesz zobaczyć rzeczywiste średnie i standardowe odchylenia rozkładów normalnych, z których zostały narysowane punkty. Zmienne
red
iblue
utrzymują pozycje każdego punktu odpowiednio w grupie czerwonej i niebieskiej:Gdybyśmy mogli zobaczyć kolor każdego punktu, spróbowalibyśmy odzyskać średnie i standardowe odchylenia za pomocą funkcji bibliotecznych:
Ale ponieważ kolory są przed nami ukryte, rozpoczniemy proces EM ...
Po pierwsze, domyślamy się tylko wartości parametrów każdej grupy ( krok 1 ). Te domysły nie muszą być dobre:
Całkiem złe domysły - środki wyglądają, jakby były daleko od jakiegokolwiek „środka” grupy punktów.
Aby kontynuować EM i poprawić te przypuszczenia, obliczamy prawdopodobieństwo, że każdy punkt danych (niezależnie od jego tajnego koloru) pojawi się pod tymi przypuszczeniami dla średniej i odchylenia standardowego ( krok 2 ).
Zmienna
both_colours
przechowuje każdy punkt danych. Funkcjastats.norm
oblicza prawdopodobieństwo punktu o rozkładzie normalnym na podstawie podanych parametrów:To mówi nam na przykład, że przy naszych bieżących przypuszczeniach punkt danych na 1,761 jest znacznie bardziej czerwony (0,189) niż niebieski (0,00003).
Możemy zamienić te dwie wartości prawdopodobieństwa na wagi ( krok 3 ), aby sumowały się do 1 w następujący sposób:
Dzięki naszym bieżącym oszacowaniom i naszym nowo obliczonym wagom możemy teraz obliczyć nowe, prawdopodobnie lepsze oszacowania parametrów ( krok 4 ). Potrzebujemy funkcji dla średniej i funkcji dla odchylenia standardowego:
Wyglądają one bardzo podobnie do zwykłych funkcji do średniej i odchylenia standardowego danych. Różnica polega na zastosowaniu
weight
parametru, który przypisuje wagę do każdego punktu danych.Ta waga jest kluczem do EM. Im większa waga koloru w punkcie danych, tym bardziej punkt danych wpływa na następne oszacowania parametrów tego koloru. Ostatecznie powoduje to pociągnięcie każdego parametru we właściwym kierunku.
Nowe domysły są obliczane za pomocą tych funkcji:
Proces EM jest następnie powtarzany z tymi nowymi domysłami, począwszy od kroku 2. Możemy powtórzyć kroki dla danej liczby iteracji (powiedzmy 20) lub dopóki nie zobaczymy, że parametry się zbiegają.
Po pięciu iteracjach widzimy, że nasze początkowe błędne domysły zaczynają się poprawiać:
Po 20 iteracjach proces EM zbliżył się mniej więcej:
Dla porównania, oto wyniki procesu EM w porównaniu z wartościami obliczonymi, gdy informacja o kolorze nie jest ukryta:
Uwaga: ta odpowiedź została zaadaptowana z mojej odpowiedzi na temat Przepełnienia stosu tutaj .
źródło
Po odpowiedzi Zhubarba zaimplementowałem przykład EM „Do podrzucania monet” Do i Batzoglou w GNU R. Zauważ, że korzystam z
mle
funkcjistats4
pakietu - pomogło mi to lepiej zrozumieć związek EM i MLE.źródło
Wszystkie powyższe wyglądają jak świetne zasoby, ale muszę odnieść się do tego wspaniałego przykładu. Przedstawia bardzo proste wyjaśnienie dotyczące znalezienia parametrów dla dwóch linii zestawu punktów. Samouczek przygotował Yair Weiss podczas MIT.
http://www.cs.huji.ac.il/~yweiss/emTutorial.pdf
http://www.cs.huji.ac.il/~yweiss/tutorials.html
źródło
Odpowiedź udzielona przez Zhubarb jest świetna, ale niestety jest w Pythonie. Poniżej znajduje się implementacja Java algorytmu EM wykonana na tym samym problemie (postawiona w artykule Do i Batzoglou, 2008). Dodałem kilka printf do standardowego wyjścia, aby zobaczyć, jak parametry się zbiegają.
Kod Java poniżej:
źródło
źródło
Sugerowałbym, żebyś przejrzał książkę Marii L. Rizzo na temat R. Jeden z rozdziałów zawiera użycie algorytmu EM z przykładem numerycznym. Pamiętam, jak przechodziłem przez kod dla lepszego zrozumienia.
Spróbuj też wyświetlić go na początku z punktu widzenia grupowania. Opracuj ręcznie, problem grupowania, w którym 10 obserwacji jest pobieranych z dwóch różnych normalnych gęstości. To powinno pomóc. Weź pomoc od R :)
źródło
źródło