2015-06-11 25 views
6

Z tym kodem:Confused o X w GaussianHMM.fit ([X])

X = numpy.array(range(0,5)) 
model = GaussianHMM(n_components=3,covariance_type='full', n_iter=1000) 
model.fit([X]) 

dostaję

tuple index out of range 
self.n_features = obs[0].shape[1] 

Więc co ty miał przekazać .fit() dokładnie? Ukryte stany ORAZ emisji w krotce? Jeśli tak, to w jakiej kolejności? Dokumentacja jest mniej niż pomocna.

Zauważyłem, że lubi być przekazywane krotki jak to nie daje błąd:

X = numpy.column_stack([range(0,5),range(0,5)]) 
model = GaussianHMM(n_components=3,covariance_type='full', n_iter=1000) 
model.fit([X]) 

Edit:

Pozwól mi wyjaśnić trochę, the documentation wskazuje, że ordinality tablicy musi być:

List of array-like observation sequences (shape (n_i, n_features)).

To prawie wskaże, że podajesz krotkę dla każdej próbki, która wskazuje w sposób binarny, które obserwacje są obecne. Jednakże their example wskazuje inaczej:

# pack diff and volume for training 
X = np.column_stack([diff, volume]) 

stąd zamieszanie

+0

nie jestem zbyt obeznany z tą biblioteką, ale wydaje się, że musisz przekazać model Markowa więcej informacji, takich jak prawdopodobieństwo początkowe, macierz przejścia itd. Czy widziałeś ich [przykład tutaj] (http://scikit-learn.org/stable/modules /hmm.html)? – CoryKramer

+0

[To jest podobne pytanie] (https://stackoverflow.com/questions/20619734/scikit-learn-gaussianhmm-valueerror-input-must-be-a-square-array) nawiasem mówiąc. – CoryKramer

+1

@CoreyKramer Tak widziałem ich przykład, czytałem ich dokumentację, a nawet czytałem ten post, który omawia fakt, że musisz przekazać tablicę numpy tablic/macierzy, a nie to, co wskazuje każda tablica. – Brooks

Odpowiedz

1

Wydaje się, funkcja GaussianHMM jest wieloczynnikową problemów z emisją tylko HMM, stąd wymaganie, aby> 1 wektorów emisji. Gdy dokumentacja odnosi się do "n_features", nie odnoszą się one do liczby sposobów wyrażania się emisji, ale do liczby ortogonalnych wektorów emisyjnych.

Dlatego też "cechy" (ortogonalne wektory emisji) nie powinny być mylone z "symbolami", które w żargonie sklearna (który prawdopodobnie jest wspólny z większą społecznością hmm dla wszystkich, które znam), odnoszą się do tego, co wartości, które system może emitować.

W przypadku problemów jednowymiarowych wektorów emisyjnych, użyj funkcji MultinomialHMM.

nadzieja, że ​​wyjaśnia, dla każdego, kto chce korzystać z tej rzeczy, nie stając się największym na świecie autorytet w HMMs :)

0

Zdaję sobie sprawę, że jest to stary wątek, ale problem w przykładowym kodzie jest nadal. Uważam, że przykładem jest teraz w this link i wciąż daje ten sam błąd:

tuple index out of range 
self.n_features = obs[0].shape[1] 

Linia wykraczająca kodu: model = GaussianHMM(n_components=5, covariance_type="diag", n_iter=1000).fit(X)

które powinny być: model = GaussianHMM(n_components=5, covariance_type="diag", n_iter=1000).fit([X])