Изменения

Перейти к: навигация, поиск

Алгоритм "Вперед-Назад"

61 байт добавлено, 10:18, 15 марта 2018
Псевдокод
Для следующих <tex>t</tex> можно вычислить <tex>\alpha_s(t)</tex> рекуррентно:
<tex>\alpha_{s}(t) = P(O_{1, t} | \mid X_t = s_i) = \\
= \displaystyle\sum\limits_{j \in S} P(O_{1, t} \mid X_t = s \cap X_{t-1} = j) = \\
= \displaystyle\sum\limits_{j \in S} P(O_{1, t-1} \mid X_{t-1} = j) \cdot P(X_t = s \mid X_{t-1} = j) \cdot P(O_t = o_t \mid X_t = s) = \\
<tex>\beta_s(t) = P(O_{t, T} \mid X_t = s) = \\
= \displaystyle\sum\limits_{j \in S} P(O_{t+1,T} | \mid X_{t+1} = j) \cdot P(X_{t+1} = j \mid X_t = s) \cdot P(o_{t+1} \mid X_t = s) = \\
= \displaystyle\sum\limits_{j \in S} \beta_j(t+1) \cdot a_{sj} \cdot b_{jo_{t+1}}</tex>
Теперь найдем вероятность того, что в момент <tex>t</tex> цепь будет в состоянии <tex>s</tex>:
<tex>P(X_t = s \mid O) = P(X_t = s \mid O_{1,t-1} \cap O_{t,T}) =</tex> <tex dpi="160">\dfrac{P(X_t = s \mid O_{1,t-1}) \cdot P(X_t = s | \mid O_{t,T})}{P(O)}</tex> <tex>=</tex> <tex dpi="160">\dfrac{\alpha_{s}(t) \cdot \beta_{s}(t)}{P(O)}</tex> <tex>=</tex>
<tex>=</tex> <tex dpi="160">\dfrac{\alpha_s(t)\cdot \beta_s(t)}{\sum_{i \in S}\alpha_s(t)\cdot \beta_s(t)}</tex>
Но вот вас переводят смотреть за камерами наблюдения: теперь вы не можете наблюдать за погодой, но каждый день видите того мужчину. За рабочую неделю вы заметили, что он не принес зонтик лишь в среду. С какой вероятностью во вторник шел дождь?
По вышесказанному, <tex>P(X_2 = Rain | \mid \{umbrella, umbrella, no, umbrella, umbrella\}) = </tex>  <tex>=</tex> <tex dpi="160">\fracdfrac{\alpha_{Rain}(2)\cdot \beta_{Rain}(2)}{\sum_{i \in \{Rain, Sun\}}\alpha_i(2)\cdot \beta_i(2)}</tex> <tex>=</tex> <tex dpi="160">\fracdfrac{\alpha_{Rain}(2)\cdot \beta_{Rain}(2)}{\alpha_{Rain}(2)\cdot \beta_{Rain}(2) + \alpha_{Sun}(2)\cdot \beta_{Sun}(2)}</tex> <tex>\approx 0.820</tex>.
Итак, с вероятностью <tex>\approx 82\%</tex> во вторник шел дождь.
'''fun''' alpha(s: '''int''', t: '''int'''): '''int'''
'''if''' (s, t) '''in''' fwd '''return''' fwd[s, t] f = 0 '''for''' j '''in''' S f += alpha(j, t - 1) * transitionProbability[j][, s] f *= emitProbability[s][, observations[t]] fwd[s, t] = f '''return''' fwd[s, t]
'''fun''' beta(s: '''int''', t: '''int'''): '''int''' '''if''' (s, t) '''in''' bkw '''return''' bkw[s, t] b = 0 '''for''' j '''in''' S b += beta(j, t + 1) * transitionProbability[s][, j] * emitProbability[j][, O[t + 1]] bkw[s, t] = b '''return''' bkw[s, t]
'''fun''' forward_backward():
'''for''' s '''in''' S fwd[s, 1] = emitProbability[s][, observations[1]] * П[s] bkw[s, observations.length - 1] = 1 chainProbability = 0 '''for''' j '''in''' S chainProbability += alpha(j, 1) * beta(j, 1) '''for''' s '''in''' S '''for''' t '''in''' [1, T] probabilities[s, t] = (alpha(s, t) * beta(s, t)) / chainProbability
== См. также ==
Анонимный участник

Навигация