1632
правки
Изменения
м
Пусть дана скрытая Марковская модель <tex>\lambda = \{S, \Omega, \Pi, A, B\}</tex>, где <tex>S = \{s_1, ..., s_n\}</tex> {{'''Алгоритм "Вперед---}} состояния, <tex>\Omega = \{\omega_1, ..Назад"''' (англ., \omega_m\}</tex> ''forward–backward algorithm'') {{---}} возможные событияалгоритм, позволяющий найти в [[Скрытые Марковские модели|скрытой Марковской модели]] вероятность попадания в состояние <tex>\Pi = \{\pi_1, ..., \pi_n\}</tex> {{---}} начальные вероятности, <tex>A = \{a_{ij}\}s_i</tex> {{---}} матрица переходов, а на <tex>B = \{b_{i\omega_k}\}t</tex> {{---}} вероятность наблюдения события ом шаге при последовательности наблюдений <tex>\omega_kO</tex> после перехода в состояние и (скрытой) последовательности состояний <tex>s_iX</tex>.
Алгоритм "вперед-назад" позволяет найти в скрытой Марковской модели вероятность попадания в состояние <tex>s_i</tex> на <tex>t</tex>-ом шаге при последовательности наблюдений <tex>O</tex> и (скрытой) последовательности состояний <tex>X</tex>.
== Вычисление ==
<font color=darkgreen> //* fwd, bkw {{---}} матрицы размера |S|*T, которым во время работы присваиваются промежуточные результаты alpha и beta // probabilities {{---}} матрица размера |S|*T, в которую заносится ответ // S - массив состояний, П - массив начальных вероятностей, O - последовательность наблюдений </font>
'''alphafun'''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) * transition_probabilitytransitionProbability[j, s] f *= emitProbability[s, observations[t]] fwd[s, t] = f '''return''' fwd[s, t]
f '''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) *= emit_probabilitytransitionProbability[s, j]* emitProbability[observationsj, O[t+ 1]] fwd bkw[s, t] = fb '''return''' fwdbkw[s, t]
'''beta'''(s, t): '''if''' (s, t) '''in''' bkw '''return''' bkw[s, t] b = 0 '''for''' j '''in''' S b += beta(j, t + 1) * transition_probability[s][j] * emit_probability[j][O[t + 1]] bkw[s, t] = b '''return''' bkw[s, t] fun'''forward_backward'''(): probabilities = {} '''for''' s '''in''' S fwd[s, 1] = emit_probabilityemitProbability[s][, observations[1]] * П[s] bkw[s, len(observations) .length - 1] = 1 chain_probability chainProbability = 0 '''for''' j '''in''' S chain_probability chainProbability += alpha(j, t1) * beta(j, t1) '''for''' s '''in''' S '''for''' t '''in''' [1, T] probabilities[s, t] = (alpha(s, t) * beta(s, t)) / chain_probabilitychainProbability == См. также == *[[Скрытые Марковские модели]] '''return''' probabilities*[[Алгоритм Баума-Велша]]*[[Алгоритм Витерби]] == Источники информации ==* [[wikipedia:Forward–backward_algorithm|Wikipedia {{---}} Forward–backward algorithm]]* [http://web.cecs.pdx.edu/~mperkows/JUNE1a/010.Intorduction-to-HMM.ppt Forward/Backward Algorithms for Hidden Markov Models]* [http://faculty.washington.edu/fxia/courses/LING572/forward_backward.ppt Forward-backward algorithm, Fei Xia, University of Washington] [[Категория: Дискретная математика и алгоритмы]][[Категория: Марковские цепи]]
rollbackEdits.php mass rollback
== Вычисление ==Пусть дана скрытая Марковская модель <tex>\lambda = \{S, \Omega, \Pi, A, B\}</tex>, где <tex>S = \{s_1,\ldots, s_n\}</tex> {{---}} состояния, <tex>\Omega = \{\omega_1,\ldots, \omega_m\}</tex> {{---}} возможные события, <tex>\Pi = \{\pi_1,\ldots, \pi_n\}</tex> {{---}} начальные вероятности, <tex>A = \{a_{ij}\}</tex> {{---}} матрица переходов, а <tex>B = \{b_{i\omega_k}\}</tex> {{---}} вероятность наблюдения события <tex>\omega_k</tex> после перехода в состояние <tex>s_i</tex>.За <tex>T</tex> шагов в этой модели получилась последовательность наблюдений <tex>O_{1,T} = {o_1, ...\ldots, o_T}</tex>.
Пусть в момент <tex>t</tex> мы оказались в состоянии <tex>i</tex>: <tex>X_t = i</tex>. Назовем <tex>\alpha_{i}(t)</tex> вероятность того, что при этом во время переходов образовалась последовательность наблюдений <tex>O_{1,t-1}</tex>, а <tex>\beta_{i}(t)</tex> {{---}} вероятность того, что после этого состояния мы будем наблюдать последовательность наблюдений <tex>O_{t,T}</tex>:
<tex>\alpha_{i}(t) \overset{def}{=} P(O_{1, t-1} | \mid X_t = i) \\\beta_i(t) \overset{def}{=} P(O_{t,T} | \mid X_t = i)</tex>
Нам требуется найти <tex>P(X_t = i | \mid O) = P(X_t = i | \mid O_{1,t-1} \cap O_{t,T})</tex>. Поскольку будущее Марковской цепи не зависит от прошлого, мы можем утверждать, что вероятность того, что мы будем наблюдать события <tex>O_{t,T}</tex> не зависит от того, что в прошлом мы наблюдали последовательность <tex>O_{1,t-1}</tex>, и, следовательно:
<tex>P(X_t = i | \mid O_{1,t-1} \cap O_{t,T}) =</tex> <tex dpi="160">\fracdfrac{P(X_t = i | \mid O_{1,t-1}) \cdot P(X_t = i | \mid O_{t,T})}{P(O)}</tex> <tex>=</tex> <tex dpi="160">\fracdfrac{\alpha_{i}(t) \cdot \beta_{i}(t)}{P(O)}</tex>
=== Проход вперед ===
Для следующих <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) = \\
= \displaystyle\sum\limits_{j \in S} \alpha_{j}(t-1) \cdot a_{js} \cdot b_{so_t} = \\
= b_{so_t} \cdot \displaystyle\sum\limits_{j \in S} \alpha_{j}(t-1) \cdot a_{js}</tex>
Итак, вероятность попасть в состояние <tex>s</tex> на <tex>t</tex>-ом шаге, учитывая, что после перехода произойдет событие <tex>o_t</tex> будет равна вероятности быть в состоянии <tex>j</tex> на <tex>(t- 1)</tex>-ом шаге, умноженной на вероятность перейти из состояния <tex>j</tex> в <tex>s</tex>, произведя событие <tex>o_t</tex> для всех <tex>j \in S</tex>.
=== Проход назад ===
Предыдущие <tex>\beta_s(t)</tex> считаются рекуррентно:
<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">\fracdfrac{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">\fracdfrac{\alpha_{s}(t) \cdot \beta_{s}(t)}{P(O)}</tex> <tex>=</tex>
<tex>=</tex> <tex dpi="160">\fracdfrac{\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> во вторник шел дождь.
== Псевдокод ==