Алгоритм "Вперед-Назад" — различия между версиями
Gfv (обсуждение | вклад) (худеем, граждане) |
Gfv (обсуждение | вклад) |
||
| Строка 12: | Строка 12: | ||
Нам требуется найти <tex>P(X_t = i | O) = P(X_t = i | 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 | O) = P(X_t = i | 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 | O_{1,t-1} \cap O_{t,T}) = \frac{P(X_t = i | O_{1,t-1}) \cdot P(X_t = i | O_{t,T})}{P(O)} = \frac{\alpha_{i}(t) \cdot \beta_{i}(t)}{P(O)}</tex> | + | <tex>P(X_t = i | O_{1,t-1} \cap O_{t,T}) =</tex> <tex dpi="180">\frac{P(X_t = i | O_{1,t-1}) \cdot P(X_t = i | O_{t,T})}{P(O)}</tex> <tex>=</tex> <tex dpi="180">\frac{\alpha_{i}(t) \cdot \beta_{i}(t)}{P(O)}</tex> |
=== Проход вперед === | === Проход вперед === | ||
| Строка 41: | Строка 41: | ||
Теперь найдем вероятность того, что в момент <tex>t</tex> цепь будет в состоянии <tex>s</tex>: | Теперь найдем вероятность того, что в момент <tex>t</tex> цепь будет в состоянии <tex>s</tex>: | ||
| − | <tex | + | <tex>P(X_t = s | O) = P(X_t = s | O_{1,t-1} \cap O_{t,T}) =</tex> <tex dpi="180">\frac{P(X_t = s | O_{1,t-1}) \cdot P(X_t = s | O_{t,T})}{P(O)}</tex> <tex>=</tex> <tex dpi="180">\frac{\alpha_{s}(t) \cdot \beta_{s}(t)}{P(O)}</tex> <tex>=</tex> |
| − | = \frac{\alpha_s(t)\cdot \beta_s(t)}{\sum_{i \in S}\alpha_s(t)\cdot \beta_s(t)}</tex> | + | |
| + | <tex>=</tex> <tex dpi="180">\frac{\alpha_s(t)\cdot \beta_s(t)}{\sum_{i \in S}\alpha_s(t)\cdot \beta_s(t)}</tex> | ||
== Псевдокод == | == Псевдокод == | ||
| Строка 53: | Строка 54: | ||
alpha(s, t): | alpha(s, t): | ||
if (s, t) in fwd: return fwd[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] | return fwd[s, t] | ||
beta(s, t): | beta(s, t): | ||
if (s, t) in bkw: return bkw[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]] | ||
| + | |||
| + | bkw[s, t] = b | ||
return bkw[s, t] | return bkw[s, t] | ||
forward_backward(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 | ||
Версия 04:24, 14 января 2013
Пусть дана скрытая Марковская модель , где — состояния, — возможные события, — начальные вероятности, — матрица переходов, а — вероятность наблюдения события после перехода в состояние .
За шагов в этой модели получилась последовательность наблюдений .
Алгоритм "вперед-назад" позволяет найти в скрытой Марковской модели вероятность попадания в состояние на -ом шаге при последовательности наблюдений и (скрытой) последовательности состояний .
Вычисление
Пусть в момент мы оказались в состоянии : . Назовем вероятность того, что при этом во время переходов образовалась последовательность наблюдений , а — вероятность того, что после этого состояния мы будем наблюдать последовательность наблюдений :
Нам требуется найти . Поскольку будущее Марковской цепи не зависит от прошлого, мы можем утверждать, что вероятность того, что мы будем наблюдать события не зависит от того, что в прошлом мы наблюдали последовательность , и, следовательно:
Проход вперед
Заметим, что в нужно считать равной , как вероятность получить первое событие из начального распределения.
Для следующих можно вычислить рекуррентно:
Итак, вероятность попасть в состояние на -ом шаге, учитывая, что после перехода произойдет событие будет равна вероятности быть в состоянии на -ом шаге, умноженной на вероятность перейти из состояния в , произведя событие для всех .
Проход назад
Аналогично, , так как произвольная цепочка наблюдений будет произведена, какими бы ни были состояния.
Предыдущие считаются рекуррентно:
Сглаживание вероятности
Итак, для произвольного состояния в произвольный шаг теперь известна вероятность того, что на пути к нему была произведена последовательность и вероятность того, что после него будет произведена последовательность . Чтобы найти вероятность того, что будет произведена цепочка событий, найти , нужно просуммировать произведение обеих вероятностей для всех состояний при произвольном шаге t: .
Теперь найдем вероятность того, что в момент цепь будет в состоянии :
Псевдокод
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]]
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