algorithm - reconocimiento - ¿Cuáles son las formas de decidir las probabilidades en los modelos ocultos de Markov?
modelos ocultos de markov pdf (1)
Está buscando un algoritmo EM (maximización de las expectativas) para calcular los parámetros desconocidos a partir de conjuntos de secuencias observadas. Probablemente el más utilizado es el algoritmo de Baum-Welch , que utiliza el algoritmo de avance-retroceso .
Como referencia, aquí hay un conjunto de diapositivas que he usado anteriormente para revisar HMM. Tiene una buena visión general de Forward-Backward, Viterbi y Baum-Welch
Estoy empezando a aprender modelos ocultos de Markov 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.
Entonces, ¿el modelo de Markov incluye una forma de calcular las probabilidades o se supone que algún otro modelo lo precalcula?
Lo siento si esta pregunta está desactivada. 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, aquí hay 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()