2011-10-28 11 views
6

Zaczynam uczyć się ukrytych modeli Markowa i na stronie wiki, a także na githubie jest wiele przykładów, ale większość prawdopodobieństw już tam jest (70% zmiana deszczu, 30% szansa na zmianę stanu, itp. .). Przykłady sprawdzania pisowni lub zdania wydają się studiować książki, a następnie klasyfikować prawdopodobieństwa słów.Jakie są sposoby decydowania o prawdopodobieństwach w ukrytych modelach Markowa?

Tak więc model Markowa zawiera sposób obliczenia prawdopodobieństw, czy też przypuszczamy, że do jakiegoś innego modelu, aby go wstępnie obliczyć?

Przepraszam, jeśli to pytanie jest wyłączone. Myślę, że jest to proste, jak ukryty model Markowa wybiera prawdopodobne sekwencje, ale część prawdopodobieństwa jest nieco szara dla mnie (ponieważ jest często dostarczana). Przykłady lub dowolne informacje byłyby świetne.


Dla tych, którzy nie znają modeli Markowa, oto przykład (z Wikipedii) http://en.wikipedia.org/wiki/Viterbi_algorithm i http://en.wikipedia.org/wiki/Hidden_Markov_model

#!/usr/bin/env python 

states = ('Rainy', 'Sunny') 

observations = ('walk', 'shop', 'clean') 

start_probability = {'Rainy': 0.6, 'Sunny': 0.4} 

transition_probability = { 
    'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3}, 
    'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6}, 
    } 

emission_probability = { 
    'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5}, 
    'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1}, 
    } 

#application code 
# Helps visualize the steps of Viterbi. 
def print_dptable(V): 
    print " ", 
    for i in range(len(V)): print "%7s" % ("%d" % i), 
    print 

    for y in V[0].keys(): 
     print "%.5s: " % y, 
     for t in range(len(V)): 
      print "%.7s" % ("%f" % V[t][y]), 
     print 

def viterbi(obs, states, start_p, trans_p, emit_p): 
    V = [{}] 
    path = {} 

    # Initialize base cases (t == 0) 
    for y in states: 
     V[0][y] = start_p[y] * emit_p[y][obs[0]] 
     path[y] = [y] 

    # Run Viterbi for t > 0 
    for t in range(1,len(obs)): 
     V.append({}) 
     newpath = {} 

     for y in states: 
      (prob, state) = max([(V[t-1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states]) 
      V[t][y] = prob 
      newpath[y] = path[state] + [y] 

     # Don't need to remember the old paths 
     path = newpath 

    print_dptable(V) 
    (prob, state) = max([(V[len(obs) - 1][y], y) for y in states]) 
    return (prob, path[state]) 



#start trigger 
def example(): 
    return viterbi(observations, 
        states, 
        start_probability, 
        transition_probability, 
        emission_probability) 
print example() 

Odpowiedz

4

Patrzysz na EM (oczekiwanie maksymalizacji) algorytmu do obliczania nieznanych parametrów z zestawy obserwowanych sekwencji. Prawdopodobnie najczęściej stosowanym algorytmem jest algorytm Baum-Welch, który wykorzystuje algorytm forward-backward.

Dla odniesienia, tutaj jest set of slides użyłem wcześniej do przeglądu HMM. Ma ładny przegląd Forward-Backward, Viterbi i Baum-Welch

+0

Dziękuję bardzo. Linki, które przeczytałem przed slajdami, były naprawdę dobre. Zrobili wiele pytań, które miałem, ale nadal nie jestem pewien, jak ustalono prawdopodobieństwo. Na przykład na slajdzie 41 mają prawdopodobieństwa dla każdego węzła (1/3,1/2 itd.). Próbuję dowiedzieć się, jak je zdobyć i aktualizować je. Być może na slajdach i brakuje mi tego, mam na ten temat nowości, więc zamierzam przyjrzeć się temu uważniej podczas weekendu. Dziękuję za slajdy i odpowiedź. – Lostsoul

+0

@ Lostsoul - Prawo, slajd 41 i ten region wyjaśnia właśnie, jak działa HMM w ogóle. Około slajdu 68 zaczyna mówić o tym, jak idziesz o oszacowanie parametrów (łącznie określanych jako λ) z zestawu obserwacji. A algorytm, który to robi, to Baum-Welch. – Dusty

+0

Jeszcze raz dziękuję. Nie mogę ci wystarczająco podziękować. Moja matematyka jest do bani, więc zajęło mi kilka odczytów slajdu (i dużo googlowania), aby zrozumieć, co się dzieje. Nie w pełni rozumiem matematykę, ale mam teraz logikę. Jeszcze raz dziękuję, Dusty. – Lostsoul

Powiązane problemy