Rozumiem więc, że kiedy trenujesz HMM do klasyfikacji, standardowe podejście to:
- Rozdziel swoje zestawy danych na zestawy danych dla każdej klasy
- Wytrenuj jeden HMM na klasę
- 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 .
źródło
Odpowiedzi:
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 sk i k = 1 , … , K i = 1 , … N t k 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.
źródło