Jak szkolić HMM do klasyfikacji?


12

Rozumiem więc, że kiedy trenujesz HMM do klasyfikacji, standardowe podejście to:

  1. Rozdziel swoje zestawy danych na zestawy danych dla każdej klasy
  2. Wytrenuj jeden HMM na klasę
  3. Na zestawie testowym porównaj prawdopodobieństwo każdego modelu w celu sklasyfikowania każdego okna

Ale jak mam trenować HMM w każdej klasie? Czy po prostu łączę dane dotyczące jednej klasy razem? Ale czy dane szeregów czasowych nie mają być sekwencyjne - a jeśli to zrobię, to mówię, że niektóre punkty danych są kolejne, gdy nie są?

Aby być bardziej konkretnym, mam pewne dane EEG, które są macierzą 96xT, gdzie mam 96 wektorów cech, które są gęstościami widmowymi mocy różnych częstotliwości z różnych kanałów, a T jest długością czasu sygnału (przy pewnej częstotliwości próbkowania)

Można to podzielić na okna, które znam z protokołu eksperymentalnego (dane są oznaczone), dzięki czemu mogę zebrać razem zestawy macierzy 96 * t dla każdej klasy. Gdzie t jest mniejsze niż T i oznacza rozmiar każdego okna.

Jak mam trenować HMM na tych danych? Jeśli to pomaga, próbuję użyć zestawu narzędzi pmtk3, ale otwieram się na cokolwiek naprawdę - musi on być w stanie poradzić sobie z obserwacjami o wartości rzeczywistej, ponieważ gęstości widmowe mocy są ciągłe, a nie dyskretne (domyślny zestaw narzędzi MATLAB może sobie poradzić z dyskretnymi obserwacjami).

Celem jest możliwość zaklasyfikowania okien danych EEG do danego stanu psychicznego po przeszkoleniu na podstawie oznaczonych danych. Jest to problem z interfejsem mózg-komputer korzystający z danych Berlin BCI Competition .


1
Czy ta strona odpowiada temu, czego potrzebujesz?
merours

Wygląda na to - wypróbuję to, aby się upewnić. To zdecydowanie pozwala na modele Gaussa i mieszankę modeli Gaussa, a nie tylko na wielomianach. Wygląda na to, że możesz globalnie trenować model na podstawie wielu obserwacji, więc wygląda dobrze. Chciałem właściwie nauczyć się języka Python, ponieważ ma on znacznie szersze zastosowanie. Dzięki :)
Alex McMurray

Odpowiedzi:


9

Podejście, które opisujesz przy użyciu HMM do klasyfikacji, naprawdę ma zastosowanie tylko do ustawień, w których masz niezależne sekwencje, które chcesz sklasyfikować. Na przykład, jeśli klasyfikuję sentencje zdań jako pozytywne lub negatywne, mógłbym zbudować HMM dla każdego z nich tak, jak to opisałeś. Zobacz pokrewną odpowiedź, którą tutaj podałem . Zauważ, że opiera się to na założeniu, że potrafię rozdzielić sekwencje na znaczące fragmenty, które zostaną sklasyfikowane przed porównaniem tylnych. Wydaje się, że nie dotyczy to twojego problemu, ponieważ skutecznie masz jedną serię czasową dużej długości . Oto, co bym spróbował.T.

Wspomniałeś na reddicie , że wahałeś się nad przypisaniem jednego stanu dla każdej klasy. Próbowałeś tego? Może nie działać tak źle, jak myślisz. Problem oszacowania jest również znacznie łatwiejszy w tym przypadku. Oszacowanie prawdopodobieństwa przejścia jest łatwe, po prostu się liczy. Co więcej, możesz po prostu dopasować prawdopodobieństwa emisji dla każdego stanu na podstawie zaobserwowanych danych i odpowiedniej klasy, ignorując aspekty czasowe.

Jeśli jesteś przekonany, że to zły pomysł lub okaże się, że działa on słabo, ale nadal chcesz trzymać się modeli generatywnych, możesz użyć czegoś w rodzaju hierarchicznej HMM. Na przykład możesz pozwolić stanom na najwyższym poziomie reprezentować klasy, a następnie pozwolić HMM niższego poziomu na modelowanie zmienności czasowej w obrębie klas. Możesz również użyć jednego dużego HMM, aby osiągnąć coś podobnego. Jeśli masz klas przeznaczyć stanów dla każdej klasy (tak Zjednoczone ogóle) formularza , , . Podczas treningu musisz zmusić HMM do przypisania dodatniego prawdopodobieństwa tylko przejściu do stanu w czasie gdzieN N × K s k i k = 1 , , K i = 1 , N t k tK.N.N.×K.skjak=1,,K.ja=1,N.tk pasuje do etykiety w czasie . Mogłem sformułować to nieco niezręcznie, więc mam nadzieję, że jasne jest, co mam na myśli. Oczywiście można to uogólnić na różne liczby stanów na klasę. Prawdopodobnie istnieją również inne rodzaje dynamicznych sieci bayesowskich. Teza Kevina Murphy'ego jest doskonałym odniesieniem. Omawia także konwersję HHMM na HMM.t

Na koniec możesz przejść na model dyskryminujący, taki jak warunkowe pole losowe. Model dyskryminacyjny pozwoli na łatwe włączenie bardziej złożonych funkcji i bardziej bezpośrednio odniesie się do problemu (oszacowanie gęstości warunkowej). Prawdopodobnie tego właśnie spróbuję najpierw.


Obserwowane wartości są ciągłe, więc pasowałbym do gaussa lub GMM. Jak omówiono w reddit, ogranicza to możliwości modelu. Używam tego modelu, aby zobaczyć, jak aspekt czasowy wpływa na dokładność klasyfikacji w porównaniu do modeli statycznych. Wiem, że modele dyskryminacyjne mogą być lepsze do klasyfikacji i przeczytałem fragmenty tezy Murphy'ego. To wydaje się interesujące, ale HMM został mi polecony przez mojego profesora (jest to projekt otwarty), więc spróbuję. Chcę jednak więcej pracować z sygnałami EEG / MEG w przyszłości, więc w pewnym momencie wypróbuję inne metody. :)
Alex McMurray

1
W końcu użyłem sklearn i jego wsparcia do wielu obserwacji. Wydawało się, że działa poprawnie. Powinienem zagłębić się w kod i zobaczyć, jak on sobie z tym radzi.
Alex McMurray

1
Alex, czy możesz podać link lub przykład do czegoś, co nazywasz „sklearn i jego wsparcie dla wielu obserwacji”? Od wielu lat mam do czynienia z tym problemem (i pokrewnym problemem, jak „powiedzieć” HMM, że wiele obserwacji należy do jednej klasy) i chciałbym wiedzieć, jak je rozwiązałeś.
Rubenulis
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.