2011-10-28 14 views
6

Estoy empezando a aprender modelos de markov ocultos y en la página wiki, así como en github hay muchos ejemplos pero la mayoría de las probabilidades ya están ahí (70% de cambio de lluvia, 30% de posibilidades de cambiar de estado, etc. .). Los ejemplos de revisión ortográfica o oraciones, parecen estudiar libros y luego clasificar las probabilidades de las palabras.¿Cuáles son las formas de decidir las probabilidades en modelos ocultos de Markov?

¿El modelo de Markov incluye una forma de calcular las probabilidades o se supone que algún otro modelo lo precalcula?

Lo sentimos si esta pregunta es dañada. Creo que es sencillo cómo el modelo de Markov oculto selecciona secuencias probables, pero la parte de probabilidad es un poco gris para mí (porque a menudo se proporciona). Ejemplos o cualquier información sería genial.


Para aquellos que no están familiarizados con los modelos de Markov, he aquí un ejemplo (de Wikipedia) http://en.wikipedia.org/wiki/Viterbi_algorithm y 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() 

Respuesta

4

Usted está buscando una EM (maximización de la expectativa) algoritmo para calcular los parámetros desconocidos de conjuntos de secuencias observadas. Probablemente el más utilizado sea el algoritmo Baum-Welch, que utiliza el algoritmo forward-backward.

Como referencia, aquí hay un set of slides que he utilizado anteriormente para revisar los HMM. Tiene una buena visión general de Forward-Backward, Viterbi y Baum-Welch

+0

Muchas gracias. Los enlaces que he leído antes de las diapositivas eran realmente buenos. Limpiaron muchas de las preguntas que tenía, pero todavía no estoy seguro de cómo se descifra la probabilidad. Por ejemplo, en la diapositiva, 41 tienen probabilidades para cada nodo (1/3,1/2, etc.). Intento averiguar cómo obtenerlos y seguir actualizándolos. Tal vez en las diapositivas y me falta, soy nuevo en esto, así que voy a estudiarlo más cuidadosamente durante el fin de semana. Gracias por las diapositivas y la respuesta. – Lostsoul

+0

@Lostsoul - Derecha, diapositiva 41 y esa región solo está explicando cómo funcionan los HMM en general. Alrededor de la diapositiva 68, comienza a hablar sobre cómo se calculan los parámetros (denominados colectivamente como λ) a partir de un conjunto de observaciones. Y el algoritmo que lo hace es Baum-Welch. – Dusty

+0

Gracias de nuevo, no puedo agradecerte lo suficiente. Mi matemática es una mierda, así que me tomó varias lecturas de la diapositiva (y mucha búsqueda en Google) para entender qué está pasando. No entiendo completamente las matemáticas pero ahora entiendo la lógica. Muchas gracias de nuevo, Dusty. – Lostsoul

Cuestiones relacionadas