Алгоритм "Вперед-Назад" — различия между версиями
Gfv (обсуждение | вклад) |
Gfv (обсуждение | вклад) (Пример) |
||
Строка 33: | Строка 33: | ||
<tex>\beta_s(t) = P(O_{t, T} | X_t = s) = \\ | <tex>\beta_s(t) = P(O_{t, T} | X_t = s) = \\ | ||
− | = \displaystyle\sum\limits_{j \in S} P(O_{t+1,T} | X_{t+1} = j) \cdot P(X_{t+1} = j | X_t = s) \cdot P( | + | = \displaystyle\sum\limits_{j \in S} P(O_{t+1,T} | X_{t+1} = j) \cdot P(X_{t+1} = j | X_t = s) \cdot P(o_{t+1} | X_t = s) = \\ |
− | = \displaystyle\sum\limits_{j \in S} \beta_j(t+1) \cdot a_{sj} \cdot b_{ | + | = \displaystyle\sum\limits_{j \in S} \beta_j(t+1) \cdot a_{sj} \cdot b_{jo_{t+1}}</tex> |
=== Сглаживание вероятности === | === Сглаживание вероятности === | ||
Строка 44: | Строка 44: | ||
<tex>=</tex> <tex dpi="160">\frac{\alpha_s(t)\cdot \beta_s(t)}{\sum_{i \in S}\alpha_s(t)\cdot \beta_s(t)}</tex> | <tex>=</tex> <tex dpi="160">\frac{\alpha_s(t)\cdot \beta_s(t)}{\sum_{i \in S}\alpha_s(t)\cdot \beta_s(t)}</tex> | ||
+ | |||
+ | == Пример == | ||
+ | [[Файл:HMM-Forward-Backward-Example.png|right|Пример СММ]] | ||
+ | Пусть ваша жизнь не удалась и вам пришлось работать охранником в холле офисного здания. Каждое утро вы наблюдали за тем, как один и тот же мужчина либо приносил, либо не приносил зонтик в зависимости от погоды. Увлекаясь статистикой, вы выяснили, что за день погода может поменяться с вероятностью 0.3; если на улице идет дождь, то мужчина приносит зонтик с вероятностью 0.9, а если солнечно {{---}} то с вероятностью 0.2 (пример справа). | ||
+ | |||
+ | Но вот вас переводят смотреть за камерами наблюдения: теперь вы не можете наблюдать за погодой, но каждый день видите того мужчину. За рабочую неделю вы заметили, что он не принес зонтик лишь в среду. С какой вероятностью во вторник шел дождь? | ||
+ | |||
+ | По вышесказанному, <tex>P(X_2 = Rain | \{umbrella, umbrella, no, umbrella, umbrella\}) =</tex> <tex dpi="160">\frac{\alpha_{Rain}(2)\cdot \beta_{Rain}(2)}{\sum_{i \in \{Rain, Sun\}}\alpha_{Rain}(2)\cdot \beta_{Rain}(2)}</tex> <tex>\approx 0.820</tex>. | ||
+ | |||
+ | Итак, с вероятностью <tex>\approx 82\%</tex> во вторник шел дождь. | ||
== Псевдокод == | == Псевдокод == | ||
Строка 66: | Строка 76: | ||
b = 0 | b = 0 | ||
for j in S: | for j in S: | ||
− | b += beta(j, t+1) * transition_probability[s][j] * emit_probability[j][O[t]] | + | b += beta(j, t+1) * transition_probability[s][j] * emit_probability[j][O[t+1]] |
bkw[s, t] = b | bkw[s, t] = b |
Версия 07:06, 14 января 2013
Пусть дана скрытая Марковская модель
, где — состояния, — возможные события, — начальные вероятности, — матрица переходов, а — вероятность наблюдения события после перехода в состояние .За
шагов в этой модели получилась последовательность наблюдений .Алгоритм "вперед-назад" позволяет найти в скрытой Марковской модели вероятность попадания в состояние
на -ом шаге при последовательности наблюдений и (скрытой) последовательности состояний .Содержание
Вычисление
Пусть в момент
мы оказались в состоянии : . Назовем вероятность того, что при этом во время переходов образовалась последовательность наблюдений , а — вероятность того, что после этого состояния мы будем наблюдать последовательность наблюдений :
Нам требуется найти
. Поскольку будущее Марковской цепи не зависит от прошлого, мы можем утверждать, что вероятность того, что мы будем наблюдать события не зависит от того, что в прошлом мы наблюдали последовательность , и, следовательно:
Проход вперед
Заметим, что в
нужно считать равной , как вероятность получить первое событие из начального распределения.Для следующих
можно вычислить рекуррентно:
Итак, вероятность попасть в состояние
на -ом шаге, учитывая, что после перехода произойдет событие будет равна вероятности быть в состоянии на -ом шаге, умноженной на вероятность перейти из состояния в , произведя событие для всех .Проход назад
Аналогично,
, так как произвольная цепочка наблюдений будет произведена, какими бы ни были состояния.Предыдущие
считаются рекуррентно:
Сглаживание вероятности
Итак, для произвольного состояния
в произвольный шаг теперь известна вероятность того, что на пути к нему была произведена последовательность и вероятность того, что после него будет произведена последовательность . Чтобы найти вероятность того, что будет произведена цепочка событий, найти , нужно просуммировать произведение обеих вероятностей для всех состояний при произвольном шаге t: .Теперь найдем вероятность того, что в момент
цепь будет в состоянии :
Пример
Пусть ваша жизнь не удалась и вам пришлось работать охранником в холле офисного здания. Каждое утро вы наблюдали за тем, как один и тот же мужчина либо приносил, либо не приносил зонтик в зависимости от погоды. Увлекаясь статистикой, вы выяснили, что за день погода может поменяться с вероятностью 0.3; если на улице идет дождь, то мужчина приносит зонтик с вероятностью 0.9, а если солнечно — то с вероятностью 0.2 (пример справа).
Но вот вас переводят смотреть за камерами наблюдения: теперь вы не можете наблюдать за погодой, но каждый день видите того мужчину. За рабочую неделю вы заметили, что он не принес зонтик лишь в среду. С какой вероятностью во вторник шел дождь?
По вышесказанному,
.Итак, с вероятностью
во вторник шел дождь.Псевдокод
fwd = {} bkw = {} for s in S: fwd[s, 1] = emit_probability[s][observations[1]] * П[s] bkw[s, len(observations) - 1] = 1 alpha(s, t): if (s, t) in fwd: return fwd[s, t] f = 0 for j in S: f += alpha(j, t-1) * transition_probability[j][s] f *= emit_probability[s][observations[t]] fwd[s, t] = f return fwd[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] forward_backward(s, t): chain_probability = 0 for j in S: chain_probability = alpha(j, t)*beta(j, t) return (alpha(s, t)*beta(s, t)) / chain_probability