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()
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
@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
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