Algoritmo hacia adelante-hacia atrás (forward-backward)
Utilizamos el algoritmo forward-backward para calcular ^γij y
^δj. Recordemos que
^δj=P(St=j|x)=P(x,St=j)P(x)^γij=P(St−1=i,St=j|x)=P(x,St−1=i,St=j)P(x)
El cálculo de cada una de las probabilidades de arriba es computacionalmente
intensivo, por ejemplo para calcular P(x):
P(x)=∑Sps1(x1)ps1,s2ps2(x2)⋯psT−1,sTpsT(xT)
donde S son las combinaciones de posibles estados (MT
posibilidades) por tanto esta aproximación no es factible. Es por esto que
surge la necesidad de un algoritmo más eficiente.
El algoritmo hacia adelante-hacia atrás usa el principio de programación
dinámica(recursión inteligente) para calcular ^γij y
^δj en tiempo lineal (M2T), consta de dos pasos y explota las
independencias condicionales del modelo.
Probabilidad hacia adelante
Definimos la probabilidad hacia adelante αi(t) como la probabilidad
conjunta de observar las primeras t observaciones xj (j=1,...,t) y
siendo i el estado al tiempo t:
αi(t)=P(X1=x1,...,XT=xt,St=i)
La probabilidad se puede evaluar de manera recursiva siguiendo la fórmula:
αi(1)=πkpi(x1) para i=1,...,M
αi(t)=pi(xt)∑Mj=1αj(t−1)pj,i para t=2,...,T e
i=1,...,M.
Prueba:
La idea clave es usar (St,Xt)⊥(X1,...,Xt−1)|St−1
αi(t)=P(x1,...,xt,St=i)=M∑j=1P(x1,...,xt,St=i,St−1=j)=M∑j=1P(x1,...,xt−1,St−1=j)P(xt|St=i)P(St=1|St−1=j)=M∑j=1αj(t−1)pi(xt)pj,i
Probabilidad hacia atrás
Definimos la probabilidad hacia atrás βi(t) como la probabilidad
condicional de las observaciones posteriores al tiempo t (xt+1,...,xT)
dado que el estado al tiempo t es i.
βi(t)=P(xt+1,...,xT|St=i)
para t=1,...T−1.
La recursión de la probabilidad hacia atrás se evalúa como:
βi(T)=1, para i=1,...,M.
βi(t)=∑Mi=1pi,jpj(xt+1)βi(t+1) para t=1,...,T−1.
Prueba:
La idea clave es usar Xt+1⊥(Xt+2,...,XT)|St+1
βi(t)=P(xt+1,...,xT|St=i)=M∑j=1P(xt+1,...,xT,St+1=j|St=i)=M∑j=1P(St+1=j|St=i)P(xt+1,...,xT|St+1=j)=M∑j=1pi,jP(xt+1,...,xT|St+1=j)=M∑j=1pi,jP(xt+1|St+1=j)P(xt+2,...,xT|st+1=j)=M∑j=1pi,jpj(xt+1)βj(t+1)
Escribimos δ y γ
Ahora vemos como escrbir δj y γi,j usando las
probabilidades hacia adelante y hacia atrás:
^δj(t)=P(St=j|x)=P(x,St=j)P(x)=αj(t)βj(t)∑Mi=1αi(T)
Prueba:
P(x1,...,xT,St=j)=P(x1,...,xt,St=j)P(xt+1,...,xT|St=j)=αj(t)βj(t)
Para el denominador notemos que:
P(x)=M∑iP(x,St=i)=M∑i=1αi(t)βi(t)
esto se cumple para cualquier t, así que si tomamos t=T:
P(x)=M∑i=1αi(T)
En el caso de γi,j tenemos:
^γij=P(St−1=i,St=j|x)=P(x,St−1=i,St=j)P(x)=αi(t−1)βj(t)pi,jpj(xt)P(x)
Prueba:
P(x1,...,xT,St−1=i,St=j)=P(x1,...,xt−1,St−1=i)P(xt+1,...,XT|St=j)P(St=j|St−1=i)P(xt|St=j)=αi(t−1)βj(t)pi,jpj(xt)
Resumen de algoritmo de estimación
Entonces, el algoritmo de estimación itera de la siguiente manera:
Comenzamos con valores inciales ^δj y ^γij.
Actualizamos los parámetros
^pij=^γij∑l^γil
y los correspondientes a las densidades pj(x).
Utilizando el conjunto de parámetros actuales (^pij y los
correspondientes a pj(x)) calculamos ^δj y ^γij
a través del algoritmo hacia adelante-hacia atrás.
Iteramos entre 2 y 3.
Algoritmo de Viterbi
En muchas de las aplicaciones de HMM nos interesa hacer inferencia de la
secuencia de estados {S1,...,ST}, en este caso el criterio de optimización
es:
MAP(S|x)=argmaxsP(S|x)=argmaxsP(S,x)
Aqui estamos buscando el camino más probable. Si consideramos un algoritmo
de fuerza bruta, esto es, realizamos búsqueda exahustiva sobre todas las
posibles secuencias tendríamos que considerar MT casos. Es por ello que
nuevamente recurrimos a un algoritmo de programación dinámica.