Алгоритм вперед-назад

редактировать

алгоритм вперед-назад - это алгоритм вывода для скрытых марковских моделей, которые вычисляют задние маргиналы всех скрытых переменных состояния с учетом последовательности наблюдений / выбросов o 1: T: = o 1,…, o T {\ displaystyle o_ {1: T}: = o_ {1}, \ dots, o_ {T}}{\displaystyle o_{1:T}:=o_{1},\dots,o_{T}}, т.е. вычисляет для всех скрытых переменных состояния X t ∈ {X 1,…, XT} {\ displaystyle X_ {t} \ in \ {X_ {1}, \ dots, X_ {T} \}}{\displaystyle X_{t}\in \{X_{1},\dots,X_{T}\}}, распределение P (Икс t | о 1: T) {\ Displaystyle P (X_ {t} \ | \ o_ {1: T})}{\displaystyle P(X_{t}\ |\ o_{1:T})}. Эта задача логического вывода обычно называется сглаживанием. Алгоритм использует принцип динамического программирования для эффективного вычисления значений, необходимых для получения апостериорных маргинальных распределений за два прохода. Первый проход идет вперед во времени, а второй - назад; отсюда и название «алгоритм вперед-назад».

Термин "алгоритм вперед-назад" также используется для обозначения любого алгоритма, принадлежащего к общему классу алгоритмов, которые работают с моделями последовательности в прямом-обратном порядке. В этом смысле описания в оставшейся части этой статьи относятся только к одному конкретному экземпляру этого класса.

Содержание
  • 1 Обзор
  • 2 Прямые вероятности
  • 3 Обратные вероятности
  • 4 Пример
  • 5 Производительность
  • 6 Псевдокод
  • 7 Пример Python
  • 8 См. Также
  • 9 Ссылки
  • 10 Внешние ссылки
Обзор

На первом проходе алгоритм вперед-назад вычисляет набор прямых вероятностей, которые обеспечивают для всех t ∈ {1,…, T} {\ displaystyle t \ in \ {1, \ dots, T \}}{\displaystyle t\in \{1,\dots,T\}}, вероятность попасть в какое-либо конкретное состояние с учетом первого t {\ displaystyle t}tнаблюдения в последовательности, то есть P (X t | o 1: t) {\ displaystyle P (X_ {t} \ | \ o_ {1: t})}{\displaystyle P(X_{t}\ |\ o_{1:t})}. Во втором проходе алгоритм вычисляет набор обратных вероятностей, которые обеспечивают вероятность наблюдения оставшихся наблюдений при любой начальной точке t {\ displaystyle t}t, то есть P (ot + 1: Т | Икс t) {\ Displaystyle P (o_ {t + 1: T} \ | \ X_ {t})}{\displaystyle P(o_{t+1:T}\ |\ X_{t})}. Затем эти два набора распределений вероятностей можно объединить для получения распределения по состояниям в любой конкретный момент времени с учетом всей последовательности наблюдений:

P (X t | o 1: T) = P (X t | o 1: t, ot + 1: T) ∝ п (ot + 1: T | X t) P (X t | o 1: t) {\ displaystyle P (X_ {t} \ | \ o_ {1: T}) = P (X_ {t} \ | \ o_ {1: t}, o_ {t + 1: T}) \ propto P (o_ {t + 1: T} \ | \ X_ {t}) P (X_ {t } | o_ {1: t})}{\displaystyle P(X_{t}\ |\ o_{1:T})=P(X_{t}\ |\ o_{1:t},o_{t+1:T})\propto P(o_{t+1:T}\ |\ X_{t})P(X_{t}|o_{1:t})}

Последний шаг следует из применения правила Байеса и условной независимости для ot + 1: T {\ displaystyle o_ {t + 1: T}}{\displaystyle o_{t+1:T}}и o 1: t {\ displaystyle o_ {1: t}}{\displaystyle o_{1:t}}с учетом X t {\ displaystyle X_ {t}}X_{t}.

Как описано выше, алгоритм включает три этапа:

  1. вычисление прямых вероятностей
  2. вычисление обратных вероятностей
  3. вычисление сглаженных значений.

прямое и Обратные шаги также могут называться «прямой проход сообщения» и «обратный проход сообщения» - эти термины связаны с передачей сообщения, используемой в целом распространение веры приближается. Для каждого отдельного наблюдения в последовательности вычисляются вероятности, которые будут использоваться для вычислений при следующем наблюдении. Шаг сглаживания можно рассчитать одновременно во время обратного прохода. Этот шаг позволяет алгоритму учитывать любые прошлые наблюдения за выходными данными для вычисления более точных результатов.

Алгоритм прямого-обратного можно использовать для поиска наиболее вероятного состояния в любой момент времени. Однако его нельзя использовать для поиска наиболее вероятной последовательности состояний (см. алгоритм Витерби ).

Прямые вероятности

В нижеследующем описании будут использоваться матрицы значений вероятностей, а не распределения вероятностей, хотя в целом алгоритм прямого-обратного может применяться как к непрерывным, так и к дискретным вероятностным моделям.

Мы преобразуем распределения вероятностей, относящиеся к данной скрытой марковской модели, в матричную запись следующим образом. Вероятности перехода P (X t ∣ X t - 1) {\ displaystyle \ mathbf {P} (X_ {t} \ mid X_ {t-1})}\mathbf {P} (X_{t}\mid X_{t-1})данной случайной величины X t {\ displaystyle X_ {t}}X_{t}, представляющий все возможные состояния в скрытой марковской модели, будет представлен матрицей T {\ displaystyle \ mathbf {T}}\mathbf {T} где индекс столбца j {\ displaystyle j}jбудет представлять целевое состояние, а индекс строки i {\ displaystyle i}iпредставляет начальное состояние. Переход из состояния вектора-строки π t {\ displaystyle \ mathbf {\ pi _ {t}}}{\displaystyle \mathbf {\pi _{t}} }в состояние инкрементного вектора-строки π t + 1 {\ displaystyle \ mathbf {\ pi _ {t + 1}}}{\displaystyle \mathbf {\pi _{t+1}} }записывается как π t + 1 = π t T {\ displaystyle \ mathbf {\ pi _ {t + 1}} = \ mathbf {\ pi _ {t}} \ mathbf {T}}{\displaystyle \mathbf {\pi _{t+1}} =\mathbf {\pi _{t}} \mathbf {T} }. В приведенном ниже примере представлена ​​система, в которой вероятность оставаться в том же состоянии после каждого шага составляет 70%, а вероятность перехода в другое состояние составляет 30%. Тогда матрица перехода имеет следующий вид:

T = (0,7 0,3 0,3 0,7) {\ displaystyle \ mathbf {T} = {\ begin {pmatrix} 0,7 0,3 \\ 0,3 0,7 \ end {pmatrix}}}\mathbf {T} ={\begin{pmatrix}0.70.3\\0.30.7\end{pmatrix}}

В типичной марковской модели мы умножаем вектор состояния на эту матрицу, чтобы получить вероятности для последующего состояния. В скрытой марковской модели состояние неизвестно, и вместо этого мы наблюдаем события, связанные с возможными состояниями. Матрица событий в форме:

B = (0,9 0,1 0,2 0,8) {\ displaystyle \ mathbf {B} = {\ begin {pmatrix} 0,9 0,1 \\ 0,2 0,8 \ end {pmatrix}}}\mathbf {B} ={\begin{pmatrix}0.90.1\\0.20.8\end{pmatrix}}

обеспечивает вероятности наблюдения событий в конкретном состоянии. В приведенном выше примере событие 1 будет наблюдаться в 90% случаев, если мы находимся в состоянии 1, в то время как событие 2 имеет 10% вероятность возникновения в этом состоянии. Напротив, событие 1 будет наблюдаться только в 20% случаев, если мы находимся в состоянии 2, а вероятность возникновения события 2 составляет 80%. Для произвольного вектора-строки, описывающего состояние системы (π {\ displaystyle \ mathbf {\ pi}}\mathbf {\pi } ), тогда вероятность наблюдения события j равна:

P (O знак равно j) знак равно ∑ я π я В я, j {\ displaystyle \ mathbf {P} (O = j) = \ sum _ {i} \ pi _ {i} B_ {i, j}}{\displaystyle \mathbf {P} (O=j)=\sum _{i}\pi _{i}B_{i,j}}

Это может быть представлен в матричной форме путем умножения вектора-строки состояния (π {\ displaystyle \ mathbf {\ pi}}\mathbf {\pi } ) на матрицу наблюдения (O j = diag (B ∗, oj) {\ displaystyle \ mathbf {O_ {j}} = \ mathrm {diag} (B _ {*, o_ {j}})}{\displaystyle \mathbf {O_{j}} =\mathrm {diag} (B_{*,o_{j}}) }), содержащий только диагональные элементы. Каждая запись - это вероятность наблюдаемого события для каждого состояния. Продолжая приведенный выше пример, наблюдение за событием 1 будет:

O 1 = (0,9 0,0 0,0 0,2) {\ displaystyle \ mathbf {O_ {1}} = {\ begin {pmatrix} 0,9 0,0 \\ 0,0 0.2 \ end {pmatrix}}}\mathbf {O_{1}} ={\begin{pmatrix}0.90.0\\0.00.2\end{pmatrix}}

Это позволяет нам вычислить новый вектор состояния ненормализованных вероятностей π ′ {\ displaystyle \ mathbf {\ pi '}}{\displaystyle \mathbf {\pi '} }через правило Байеса, взвешивание по вероятности того, что каждый элемент π {\ displaystyle \ mathbf {\ pi}}\mathbf {\pi } сгенерировал событие 1 как:

π ′ = π O 1 {\ displaystyle \ mathbf {\ pi '} = \ mathbf {\ pi} \ mathbf {O_ {1}}}{\displaystyle \mathbf {\pi '} =\mathbf {\pi } \mathbf {O_{1}} }

Теперь мы можем сделать эту общую процедуру конкретной для нашей серии наблюдений. Предполагая вектор начального состояния π 0 {\ displaystyle \ mathbf {\ pi} _ {0}}{\displaystyle \mathbf {\pi } _{0}}(который может быть оптимизирован как параметр путем повторения процедуры вперед-назад), мы начните с f 0: 0 = π 0 {\ displaystyle \ mathbf {f_ {0: 0}} = \ mathbf {\ pi} _ {0}}{\displaystyle \mathbf {f_{0:0}} =\mathbf {\pi } _{0}}, затем обновите распределение состояний и взвешивание по вероятности первого наблюдения:

f 0: 1 = π 0 TO o (1) {\ displaystyle \ mathbf {f_ {0: 1}} = \ mathbf {\ pi} _ {0} \ mathbf {T} \ mathbf {O_ {o (1)}}}{\displaystyle \mathbf {f_{0:1}} =\mathbf {\pi } _{0}\mathbf {T} \mathbf {O_{o(1)}} }

Этот процесс можно продолжить с дополнительными наблюдениями, используя:

f 0: t = f 0: t - 1 TO o (t) {\ displaystyle \ mathbf {f_ {0: t}} = \ mathbf {f_ {0: t-1}} \ mathbf {T} \ mathbf {O_ {o (t)}}}{\displaystyle \mathbf {f_{0:t}} =\mathbf {f_{0:t-1}} \mathbf {T} \mathbf {O_{o(t)}} }

Это значение является ненормализованным форвардом вектор вероятности. I-я запись этого вектора обеспечивает:

f 0: t (i) = P (o 1, o 2,…, ot, X t = xi | π 0) {\ displaystyle \ mathbf {f_ {0 : t}} (i) = \ mathbf {P} (o_ {1}, o_ {2}, \ dots, o_ {t}, X_ {t} = x_ {i} | \ mathbf {\ pi} _ { 0})}{\displaystyle \mathbf {f_{0:t}} (i)=\mathbf {P} (o_{1},o_{2},\dots,o_{t},X_{t}=x_{i}|\mathbf {\pi } _{0})}

Обычно мы нормализуем вектор вероятности на каждом шаге так, чтобы сумма его элементов равнялась 1. Таким образом, на каждом шаге вводится коэффициент масштабирования, такой что:

f ^ 0: t = ct - 1 е ^ 0: t - 1 К o (t) {\ displaystyle \ mathbf {{\ hat {f}} _ {0: t}} = c_ {t} ^ {- 1} \ \ mathbf {{\ hat { f}} _ {0: t-1}} \ mathbf {T} \ mathbf {O_ {o (t)}}}{\displaystyle \mathbf {{\hat {f}}_{0:t}} =c_{t}^{-1}\ \mathbf {{\hat {f}}_{0:t-1}} \mathbf {T} \mathbf {O_{o(t)}} }

где f ^ 0: t - 1 {\ displaystyle \ mathbf {{ \ hat {f}} _ {0: t-1}}}\mathbf {{\hat {f}}_{0:t-1}} представляет масштабированный вектор из предыдущего шага, а ct {\ displaystyle c_ {t}}c_{t}представляет коэффициент масштабирования, который заставляет элементы результирующего вектора суммироваться до 1. Произведение коэффициентов масштабирования представляет собой полную вероятность наблюдения данных событий независимо от конечных состояний:

P (o 1, o 2,…, ot | π 0) = ∏ s = 1 tcs {\ displayst yle \ mathbf {P} (o_ {1}, o_ {2}, \ dots, o_ {t} | \ mathbf {\ pi} _ {0}) = \ prod _ {s = 1} ^ {t} c_ {s}}{\displaystyle \mathbf {P} (o_{1},o_{2},\dots,o_{t}|\mathbf {\pi } _{0})=\prod _{s=1}^{t}c_{s}}

Это позволяет нам интерпретировать масштабированный вектор вероятности как:

f ^ 0: t (i) = f 0: t (i) ∏ s = 1 tcs = P (o 1, o 2,…, Ot, X t = xi | π 0) п (о 1, о 2,…, ot | π 0) = P (X t = xi | o 1, o 2,…, ot, π 0) {\ displaystyle \ mathbf {{\ hat {f }} _ {0: t}} (i) = {\ frac {\ mathbf {f_ {0: t}} (i)} {\ prod _ {s = 1} ^ {t} c_ {s}}} = {\ frac {\ mathbf {P} (o_ {1}, o_ {2}, \ dots, o_ {t}, X_ {t} = x_ {i} | \ mathbf {\ pi} _ {0}) } {\ mathbf {P} (o_ {1}, o_ {2}, \ dots, o_ {t} | \ mathbf {\ pi} _ {0})}} = \ mathbf {P} (X_ {t} = x_ {i} | o_ {1}, o_ {2}, \ dots, o_ {t}, \ mathbf {\ pi} _ {0})}{\displaystyle \mathbf {{\hat {f}}_{0:t}} (i)={\frac {\mathbf {f_{0:t}} (i)}{\prod _{s=1}^{t}c_{s}}}={\frac {\mathbf {P} (o_{1},o_{2},\dots,o_{t},X_{t}=x_{i}|\mathbf {\pi } _{0})}{\mathbf {P} (o_{1},o_{2},\dots,o_{t}|\mathbf {\pi } _{0})}}=\mathbf {P} (X_{t}=x_{i}|o_{1},o_{2},\dots,o_{t},\mathbf {\pi } _{0})}

Таким образом, мы находим, что произведение коэффициентов масштабирования дает нам с полной вероятностью для наблюдения данной последовательности до момента времени t и что масштабированный вектор вероятности дает нам вероятность нахождения в каждом состоянии в это время.

Обратные вероятности

Подобная процедура может быть построена для поиска обратных вероятностей. Они предназначены для обеспечения вероятностей:

bt: T (i) = P (ot + 1, ot + 2,…, o T | X t = xi) {\ displaystyle \ mathbf {b_ {t: T}} (i) = \ mathbf {P} (o_ {t + 1}, o_ {t + 2}, \ dots, o_ {T} | X_ {t} = x_ {i})}\mathbf {b_{t:T}} (i)=\mathbf {P} (o_{t+1},o_{t+2},\dots,o_{T}|X_{t}=x_{i})

То есть мы теперь мы хотим предположить, что мы начинаем с определенного состояния (X t = xi {\ displaystyle X_ {t} = x_ {i}}X_{t}=x_{i}), и теперь нас интересует вероятность наблюдения все будущие события из этого состояния. Поскольку исходное состояние считается заданным (т.е. априорная вероятность этого состояния = 100%), мы начинаем с:

b T: T = [1 1 1…] T {\ displaystyle \ mathbf {b_ {T: T}} = [1 \ 1 \ 1 \ \ dots] ^ {T}}\mathbf {b_{T:T}} =[1\ 1\ 1\ \dots ]^{T}

Обратите внимание, что теперь мы используем вектор-столбец, в то время как прямые вероятности использовали векторы-строки. Затем мы можем работать в обратном направлении, используя:

bt - 1: T = TO tbt: T {\ displaystyle \ mathbf {b_ {t-1: T}} = \ mathbf {T} \ mathbf {O_ {t}} \ mathbf {b_ {t: T}}}\mathbf {b_{t-1:T}} =\mathbf {T} \mathbf {O_{t}} \mathbf {b_{t:T}}

Хотя мы могли бы также нормализовать этот вектор, чтобы сумма его записей равнялась единице, обычно это не делается. Отмечая, что каждая запись содержит вероятность будущей последовательности событий с учетом конкретного начального состояния, нормализация этого вектора была бы эквивалентна применению теоремы Байеса для нахождения вероятности каждого начального состояния с учетом будущих событий (при условии единообразных априорных значений для вектора конечного состояния). Однако чаще для масштабирования этого вектора используются те же константы c t {\ displaystyle c_ {t}}c_{t}, используемые в расчетах прямой вероятности. b T: T {\ displaystyle \ mathbf {b_ {T: T}}}\mathbf {b_{T:T}} не масштабируется, но в последующих операциях используется:

b ^ t - 1: T = ct - 1 К tb ^ t: T {\ displaystyle \ mathbf {{\ hat {b}} _ {t-1: T}} = c_ {t} ^ {- 1} \ mathbf {T} \ mathbf {O_ {t} } \ mathbf {{\ hat {b}} _ {t: T}}}\mathbf {{\hat {b}}_{t-1:T}} =c_{t}^{-1}\mathbf {T} \mathbf {O_{t}} \mathbf {{\hat {b}}_{t:T}}

где b ^ t: T {\ displaystyle \ mathbf {{\ hat {b}} _ {t: T} }}\mathbf {{\hat {b}}_{t:T}} представляет предыдущий масштабированный вектор. Этот результат состоит в том, что масштабированный вектор вероятности связан с обратными вероятностями следующим образом:

b ^ t: T (i) = bt: T (i) ∏ s = t + 1 T cs {\ displaystyle \ mathbf {{\ шляпа {b}} _ {t: T}} (i) = {\ frac {\ mathbf {b_ {t: T}} (i)} {\ prod _ {s = t + 1} ^ {T} c_ {s}}}}\mathbf {{\hat {b}}_{t:T}} (i)={\frac {\mathbf {b_{t:T}} (i)}{\prod _{s=t+1}^{T}c_{s}}}

Это полезно, поскольку позволяет нам найти общую вероятность нахождения в каждом состоянии в заданный момент времени t путем умножения этих значений:

γ t (i) = P (X t = xi | o 1, o 2,…, o T, π 0) = P (o 1, o 2,…, o T, X t = xi | π 0) P (o 1, o 2,…, о T | π 0) знак равно е 0: T (я) ⋅ bt: T (я) ∏ s = 1 T cs = f ^ 0: t (я) ⋅ b ^ t: T (я) {\ Displaystyle \ mathbf {\ gamma _ {t}} (i) = \ mathbf {P} (X_ {t} = x_ {i} | o_ {1}, o_ {2}, \ dots, o_ {T}, \ mathbf {\ pi} _ {0}) = {\ frac {\ mathbf {P} (o_ {1}, o_ {2}, \ dots, o_ {T}, X_ {t} = x_ {i} | \ mathbf {\ pi} _ {0})} {\ mathbf {P} (o_ {1}, o_ {2}, \ dots, o_ {T} | \ mathbf {\ pi} _ {0})}} = {\ frac {\ mathbf {f_ {0: t}} (i) \ cdot \ mathbf {b_ {t: T}} (i)} {\ prod _ {s = 1} ^ {T} c_ {s}}} = \ mathbf {{\ hat {f}} _ {0: t}} (i) \ cdot \ mathbf {{\ hat {b}} _ {t: T}} (i)}{\displaystyle \mathbf {\gamma _{t}} (i)=\mathbf {P} (X_{t}=x_{i}|o_{1},o_{2},\dots,o_{T},\mathbf {\pi } _{0})={\frac {\mathbf {P} (o_{1},o_{2},\dots,o_{T},X_{t}=x_{i}|\mathbf {\pi } _{0})}{\mathbf {P} (o_{1},o_{2},\dots,o_{T}|\mathbf {\pi } _{0})}}={\frac {\mathbf {f_{0:t}} (i)\cdot \mathbf {b_{t:T}} (i)}{\prod _{s=1}^{T}c_{s}}}=\mathbf {{\hat {f}}_{0:t}} (i)\cdot \mathbf {{\hat {b}}_{t:T}} (i)}

Чтобы понять это, отметим, что f 0: t (i) ⋅ bt: T (i) {\ displaystyle \ mathbf {f_ {0: t}} (i) \ cdot \ mathbf {b_ {t: T}} (i)}\mathbf {f_{0:t}} (i)\cdot \mathbf {b_{t:T}} (i)обеспечивает вероятность наблюдения данных событий способом, который проходит через состояние xi {\ displaystyle x_ {i}}x_{i}в момент времени t. Эта вероятность включает прямые вероятности, охватывающие все события до момента времени t, а также обратные вероятности, которые включают все будущие события. Это числитель, который мы ищем в нашем уравнении, и мы делим его на общую вероятность последовательности наблюдений для нормализации этого значения и извлекаем только вероятность того, что X t = xi {\ displaystyle X_ {t} = x_ { i}}X_{t}=x_{i}. Эти значения иногда называют «сглаженными значениями», поскольку они объединяют прямую и обратную вероятности для вычисления окончательной вероятности.

Значения γ t (i) {\ displaystyle \ mathbf {\ gamma _ {t}} (i)}\mathbf {\gamma _{t}} (i), таким образом, обеспечивают вероятность нахождения в каждом состоянии в определенный момент времени. т. Таким образом, они полезны для определения наиболее вероятного состояния в любое время. Термин «наиболее вероятное состояние» несколько неоднозначен. Хотя наиболее вероятное состояние с наибольшей вероятностью будет правильным в данной точке, последовательность индивидуально вероятных состояний вряд ли будет наиболее вероятной последовательностью. Это связано с тем, что вероятности для каждой точки рассчитываются независимо друг от друга. Они не принимают во внимание вероятности перехода между состояниями, и, таким образом, можно получить состояния в два момента (t и t + 1), которые являются наиболее вероятными в эти моменты времени, но которые имеют очень небольшую вероятность возникновения вместе, т. Е. п (Икс t = xi, X t + 1 = xj) ≠ P (X t = xi) P (X t + 1 = xj) {\ displaystyle \ mathbf {P} (X_ {t} = x_ { i}, X_ {t + 1} = x_ {j}) \ neq \ mathbf {P} (X_ {t} = x_ {i}) \ mathbf {P} (X_ {t + 1} = x_ {j})}\mathbf {P} (X_{t}=x_{i},X_{t+1}=x_{j})\neq \mathbf {P} (X_{t}=x_{i})\mathbf {P} (X_{t+1}=x_{j}). Наиболее вероятная последовательность состояний, которая произвела последовательность наблюдений, может быть найдена с помощью алгоритма Витерби.

Пример

В этом примере за основу взят зонтичный мир из Russell Norvig 2010 Глава 15 стр. 567, в которой мы хотели бы сделать вывод о погоде на основании наблюдения другого человека, несущего или не несущего зонтик. Мы предполагаем два возможных состояния погоды: состояние 1 = дождь, состояние 2 = без дождя. Мы предполагаем, что у погоды есть 70% шанс оставаться неизменной каждый день и 30% шанс измениться. Тогда вероятности перехода таковы:

T = (0,7 0,3 0,3 0,7) {\ displaystyle \ mathbf {T} = {\ begin {pmatrix} 0,7 0,3 \\ 0,3 0,7 \ end {pmatrix}}}\mathbf {T} ={\begin{pmatrix}0.70.3\\0.30.7\end{pmatrix}}

Мы также предполагаем, что каждое состояние генерирует одно из двух возможных событий: событие 1 = зонтик, событие 2 = отсутствие зонтика. Условные вероятности их появления в каждом состоянии задаются матрицей вероятностей:

B = (0,9 0,1 0,2 0,8) {\ displaystyle \ mathbf {B} = {\ begin {pmatrix} 0,9 0,1 \\ 0,2 0.8 \ end {pmatrix}}}\mathbf {B} ={\begin{pmatrix}0.90.1\\0.20.8\end{pmatrix}}

Затем мы наблюдаем следующую последовательность событий: {зонтик, зонтик, без зонта, зонтик, зонтик}, которые мы представим в наших расчетах как:

O 1 = (0.9 0,0 0,0 0,2) O 2 = (0,9 0,0 0,0 0,2) O 3 = (0,1 0,0 0,0 0,8) O 4 = (0,9 0,0 0,0 0,2) O 5 = (0,9 0,0 0,0 0,2) {\ displaystyle \ mathbf {O_ {1} } = {\ begin {pmatrix} 0.9 0.0 \\ 0.0 0.2 \ end {pmatrix}} ~~ \ mathbf {O_ {2}} = {\ begin {pmatrix} 0.9 0.0 \\ 0.0 0. 2 \ end {pmatrix}} ~~ \ mathbf {O_ {3}} = {\ begin {pmatrix} 0.1 0.0 \\ 0.0 0.8 \ end {pmatrix}} ~~ \ mathbf {O_ {4}} = {\ begin {pmatrix} 0,9 0,0 \\ 0,0 0,2 \ end {pmatrix}} ~~ \ mathbf {O_ {5}} = {\ begin {pmatrix} 0,9 и 0,0 \\ 0,0 и 0,2 \ end {pmatrix}}}\mathbf {O_{1}} ={\begin{pmatrix}0.90.0\\0.00.2\end{pmatrix}}~~\mathbf {O_{2}} ={\begin{pmatrix}0.90.0\\0.00.2\end{pmatrix}}~~\mathbf {O_{3}} ={\begin{pmatrix}0.10.0\\0.00.8\end{pmatrix}}~~\mathbf {O_{4}} ={\begin{pmatrix}0.90.0\\0.00.2\end{pmatrix}}~~\mathbf {O_{5}} ={\begin{pmatrix}0.90.0\\0.00.2\end{pmatrix}}

Обратите внимание, что O 3 {\ displaystyle \ mathbf {O_ {3}}}\mathbf {O_{3}} отличается от других из-за наблюдения «без зонтика».

При вычислении прямых вероятностей мы начинаем с:

f 0: 0 = (0,5 0,5) {\ displaystyle \ mathbf {f_ {0: 0}} = {\ begin {pmatrix} 0,5 0. 5 \ end {pmatrix}}}\mathbf {f_{0:0}} ={\begin{pmatrix}0.50.5\end{pmatrix}}

, который является нашим предыдущим вектором состояния, указывающим, что мы не знаем, в каком состоянии находится погода до наших наблюдений. Хотя вектор состояния должен быть задан как вектор-строка, мы будем использовать транспонирование матрицы, чтобы было легче читать приведенные ниже вычисления. Наши вычисления записываются в виде:

(f ^ 0: t) T = ct - 1 O t (T) T (f ^ 0: t - 1) T {\ displaystyle (\ mathbf {{\ hat) {f}} _ {0: t}}) ^ {T} = c_ {t} ^ {- 1} \ mathbf {O_ {t}} (\ mathbf {T}) ^ {T} (\ mathbf {{ \ hat {f}} _ {0: t-1}}) ^ {T}}{\displaystyle (\mathbf {{\hat {f}}_{0:t}})^{T}=c_{t}^{-1}\mathbf {O_{t}} (\mathbf {T})^{T}(\mathbf {{\hat {f}}_{0:t-1}})^{T}}

вместо:

f ^ 0: t = ct - 1 f ^ 0: t - 1 TO t {\ displaystyle \ mathbf {{\ hat {f}} _ {0: t}} = c_ {t} ^ {- 1} \ mathbf {{\ hat {f}} _ {0: t-1}} \ mathbf { T} \ mathbf {O_ {t}}}{\displaystyle \mathbf {{\hat {f}}_{0:t}} =c_{t}^{-1}\mathbf {{\hat {f}}_{0:t-1}} \mathbf {T} \mathbf {O_{t}} }

Обратите внимание, что матрица преобразования также транспонируется, но в нашем примере транспонирование равно исходной матрице. Выполнение этих вычислений и нормализация результатов дает:

(f ^ 0: 1) T = c 1 - 1 (0,9 0,0 0,0 0,2) (0,7 0,3 0,3 0,7) (0,5000 0,5000) = c 1 - 1 (0,4500 0,1000) = (0,8182 0,1818) {\ displaystyle (\ mathbf {{\ hat {f}} _ {0: 1}}) ^ {T} = c_ {1} ^ {- 1} {\ begin {pmatrix} 0,9 и 0. 0 \\ 0,0 0,2 \ end {pmatrix}} {\ begin {pmatrix} 0,7 0,3 \\ 0,3 0,7 \ end {pmatrix}} {\ begin {pmatrix} 0,5000 \\ 0,5000 \ end {pmatrix} } = c_ {1} ^ {- 1} {\ begin {pmatrix} 0,4500 \\ 0,1000 \ end {pmatrix}} = {\ begin {pmatrix} 0,8182 \\ 0,1818 \ end {pmatrix}}}(\mathbf {{\hat {f}}_{0:1}})^{T}=c_{1}^{-1}{\begin{pmatrix}0.90.0\\0.00.2\end{pmatrix}}{\begin{pmatrix}0.70.3\\0.30.7\end{pmatrix}}{\begin{pmatrix}0.5000\\0.5000\end{pmatrix}}=c_{1}^{-1}{\begin{pmatrix}0.4500\\0.1000\end{pmatrix}}={\begin{pmatrix}0.8182\\0.1818\end{pmatrix}}
(f ^ 0: 2) T = c 2 - 1 (0,9 0,0 0,0 0,2) (0,7 0,3 0,3 0,7) (0,8182 0,1818) = c 2 - 1 (0,5645 0,0745) = (0,8834 0,1166) {\ displaystyle (\ mathbf {{\ hat {f}} _ {0: 2}}) ^ {T} = c_ {2} ^ {- 1} {\ begin {pmatrix} 0.9 0.0 \\ 0.0 0.2 \ end {pmatrix}} { \ begin {pmatrix} 0.7 0.3 \\ 0.3 0.7 \ end {pmatrix}} {\ begin {pmatrix} 0.8182 \\ 0.1818 \ end {pmatrix}} = c_ {2} ^ {- 1} {\ begin {pmatrix} 0,5645 \\ 0,0745 \ end {pmatrix}} = {\ begin {pmatrix} 0,8834 \\ 0,1166 \ end {pmatrix}}}(\mathbf {{\hat {f}}_{0:2}})^{T}=c_{2}^{-1}{\begin{pmatrix}0.90.0\\0.00.2\end{pmatrix}}{\begin{pmatrix}0.70.3\\0.30.7\end{pmatrix}}{\begin{pmatrix}0.8182\\0.1818\end{pmatrix}}=c_{2}^{-1}{\begin{pmatrix}0.5645\\0.0745\end{pmatrix}}={\begin{pmatrix}0.8834\\0.1166\end{pmatrix}}
(f ^ 0: 3) T = c 3 - 1 (0,1 0,0 0,0 0,8) (0,7 0,3 0,3 0,7) (0,8834 0,1166) = c 3 - 1 (0,0653 0,2772) = (0,1907 0,8093) {\ displaystyle (\ mathbf {{\ hat {f}} _ {0: 3}}) ^ {T} = c_ {3 } ^ {- 1} {\ begin {pmatrix} 0,1 0,0 \\ 0,0 0,8 \ end {pmatrix}} {\ begin {pmatrix} 0,7 0,3 \\ 0,3 0,7 \ end {pmatrix}} {\ begin {pmatrix} 0,8834 \\ 0,1166 \ end {pmatrix}} = c_ {3} ^ {- 1} {\ begin {pmatrix} 0,0653 \\ 0,2772 \ end {pmatrix}} = {\ begin {pmatrix} 0,1907 \\ 0.8093 \ end {pmatrix}}}(\mathbf {{\hat {f}}_{0:3}})^{T}=c_{3}^{-1}{\begin{pmatrix}0.10.0\\0.00.8\end{pmatrix}}{\begin{pmatrix}0.70.3\\0.30.7\end{pmatrix}}{\begin{pmatrix}0.8834\\0.1166\end{pmatrix}}=c_{3}^{-1}{\begin{pmatrix}0.0653\\0.2772\end{pmatrix}}={\begin{pmatrix}0.1907\\0.8093\end{pmatrix}}
(f ^ 0: 4) T = c 4 - 1 (0,9 0,0 0,0 0,2) (0,7 0,3 0,3 0,7) (0,1907 0,8093) = c 4 - 1 (0,3386 0,1247) = (0,7308 0,2692) {\ displaystyle (\ mathbf {{\ hat {f}} _ {0: 4}}) ^ {T} = c_ {4} ^ {- 1} {\ begin {pmatrix} 0,9 0.0 \\ 0,0 0,2 \ end {pmatrix}} {\ begin {pmatrix} 0,7 0,3 \\ 0,3 0,7 \ end {pmatrix}} {\ begin {pmatrix} 0,1907 \\ 0.8093 \ end {pmatrix }} = c_ {4} ^ {- 1} {\ begin {pmatrix} 0,3386 \\ 0,1247 \ end {pmatrix}} = {\ begin {pmatrix} 0,7308 \\ 0,2692 \ end {pmatrix}}}(\mathbf {{\hat {f}}_{0:4}})^{T}=c_{4}^{-1}{\begin{pmatrix}0.90.0\\0.00.2\end{p matrix}}{\begin{pmatrix}0.70.3\\0.30.7\end{pmatrix}}{\begin{pmatrix}0.1907\\0.8093\end{pmatrix}}=c_{4}^{-1}{\begin{pmatrix}0.3386\\0.1247\end{pmatrix}}={\begin{pmatrix}0.7308\\0.2692\end{pmatrix}}
( f ^ 0: 5) T = c 5-1 (0,9 0,0 0,0 0,2) (0,7 0,3 0,3 0,7) (0,7308 0,2692) = c 5-1 (0,5331 0,0815) = (0,8673 0,1327) {\ displaystyle (\ mathbf {{ \ hat {f}} _ {0: 5}}) ^ {T} = c_ {5} ^ {- 1} {\ begin {pmatrix} 0,9 0,0 \\ 0,0 0,2 \ end {pmatrix}} {\ begin {pmatrix} 0,7 0,3 \\ 0,3 0,7 \ end {pmatrix}} {\ begin {pmatrix} 0,7308 \\ 0,2692 \ end {pmatrix}} = c_ {5} ^ {- 1} {\ begin {pmatrix} 0,5331 \ 0,0815 \ end {pmatrix}} = {\ begin {pmatrix} 0,8673 \\ 0,1327 \ end { pmatrix}}}(\mathbf {{\hat {f}}_{0:5}})^{T}=c_{5}^{-1}{\begin{pmatrix}0.90.0\\0.00.2\end{pmatrix}}{\begin{pmatrix}0.70.3\\0.30.7\end{pmatrix}}{\begin{pmatrix}0.7308\\0.2692\end{pmatrix}}=c_{5}^{-1}{\begin{pmatrix}0.5331\\0.0815\end{pmatrix}}={\begin{pmatrix}0.8673\\0.1327\end{pmatrix}}

Для обратных вероятностей мы начинаем с:

b 5: 5 = (1.0 1.0) {\ displaystyle \ mathbf {b_ {5: 5}} = {\ begin {pmatrix} 1.0 \\ 1.0 \ end {pmatrix}}}\mathbf {b_{5:5}} ={\begin{pmatrix}1.0\\1.0\end{pmatrix}}

Затем мы можем вычислить (используя наблюдения в обратном порядке и нормализуя с разными константами):

b ^ 4: 5 = α (0,7 0,3 0,3 0,7) (0,9 0,0 0,0 0,2) (1,0000 1,0000) = α (0,6900 0,4100) = (0,6273 0,3727) {\ displaystyle \ mathbf {{\ hat {b}} _ {4: 5}} = \ alpha {\ begin {pmatrix} 0,7 и 0. 3 \\ 0,3 0,7 \ end {pmatrix}} {\ begin {pmatrix} 0,9 0,0 \\ 0,0 0,2 \ end {pmatrix}} {\ begin {pmatrix} 1,0000 \ 1,0000 \ end {pmatrix} } = \ alpha {\ begin {pmatrix} 0,6900 \\ 0,4100 \ end {pmatrix}} = {\ begin {pmatrix} 0,6273 \\ 0,3727 \ end {pmatrix}}}\mathbf {{\hat {b}}_{4:5}} =\alpha {\begin{pmatrix}0.70.3\\0.30.7\end{pmatrix}}{\begin{pmatrix}0.90.0\\0.00.2\end{pmatrix}}{\begin{pmatrix}1.0000\\1.0000\end{pmatrix}}=\alpha {\begin{pmatrix}0.6900\\0.4100\end{pmatrix}}={\begin{pmatrix}0.6273\\0.3727\end{pmatrix}}
b ^ 3: 5 = α (0,7 0,3 0,3 0,7) (0,9 0,0 0,0 0,2) (0,6273 0,3727) = α (0,4175 0,2215) = (0,6533 0,3467) {\ displaystyle \ mathbf {{\ hat {b}} _ {3: 5}} = \ alpha {\ begin {pmatrix} 0,7 и 0,3 \\ 0,3 и 0,7 \ end {pmatrix }} {\ begin {pmatrix} 0,9 0,0 \\ 0,0 0,2 \ end {pmatrix}} {\ begin {pmatrix} 0,6273 \ 0,3727 \ end {pmatrix}} = \ alpha {\ begin {pmatrix} 0,4175 \\ 0,2215 \ end {pmatrix}} = {\ begin {pmatrix} 0,6533 \\ 0,3467 \ end {pmatrix}}}\mathbf {{\hat {b}}_{3:5}} =\alpha {\begin{pmatrix}0.70.3\\0.30.7\end{pmatrix}}{\begin{pmatrix}0.90.0\\0.00.2\end{pmatrix}}{\begin{pmatrix}0.6273\\0.3727\end{pmatrix}}=\alpha {\begin{pmatrix}0.4175\\0.2215\end{pmatrix}}={\begin{pmatrix}0.6533\\0.3467\end{pmatrix}}
b ^ 2: 5 = α (0,7 0,3 0,3 0,7) (0,1 0,0 0,0 0,8) ( 0,6533 0,3467) = α (0,1289 0,2138) = (0,3763 0,6237) {\ displaystyle \ mathbf {{\ hat {b}} _ {2: 5}} = \ alpha {\ begin {pmatrix} 0,7 и 0,3 \\ 0,3 0,7 \ end {pmatrix}} {\ begin {pmatrix} 0,1 0,0 \ 0,0 0,8 \ end {pmatrix}} {\ begin {pmatrix} 0,6533 \ 0,3467 \ end {pmatrix}} = \ alpha {\ begin {pmatrix} 0,1289 \ 0,2138 \ end {pmatrix}} = {\ begin {pmatrix} 0,3763 \ 0,6237 \ end {pmatrix}}}\mathbf {{\hat {b}}_{2:5}} =\alpha {\begin{pmatrix}0.70.3\\0.30.7\end{pmatrix}}{\begin{pmatrix}0.10.0\\0.00.8\end{pmatrix}}{\begin{pmatrix}0.6533\\0.3467\end{pmatrix}}=\alpha {\begin{pmatrix}0.1289\\0.2138\end{pmatrix}}={\begin{pmatrix}0.3763\\0.6237\end{pmatrix}}
b ^ 1: 5 = α (0,7 0,3 0,3 0,7) (0,9 0,0 0,0 0,2) (0,3763 0,6237) = α (0,2745 0,1889) = (0,5923 0,4077) {\ displaystyle \ mathbf {{\ hat {b}} _ {1: 5}} = \ alpha {\ begin {pmatrix} 0,7 и 0,3 \\ 0,3 и 0,7 \ end {pmatrix}} {\ begin {pmatrix} 0,9 и 0,0 \\ 0,0 и 0,2 \ end {pmatrix}} {\ begin {pmatrix} 0,37 63 \\ 0,6237 \ end {pmatrix}} = \ alpha {\ begin {pmatrix} 0,2745 \\ 0,1889 \ end {pmatrix}} = {\ begin {pmatrix} 0,5923 \\ 0,4077 \ end {pmatrix}}}\mathbf {{\hat {b}}_{1:5}} =\alpha {\begin{pmatrix}0.70.3\\0.30.7\end{pmatrix}}{\begin{pmatrix}0.90.0\\0.00.2\end{pmatrix}}{\begin{pmatrix}0.3763\\0.6237\end{pmatrix}}=\alpha {\begin{pmatrix}0.2745\\0.1889\end{pmatrix}}={\begin{pmatrix}0.5923\\0.4077\end{pmatrix}}
b ^ 0: 5 = α (0,7 0,3 0,3 0,7) (0,9 0,0 0,0 0,2) (0,5923 0,4077) = α (0,3976 0,2170) = (0,6469 0,3531) {\ displaystyle \ mathbf {{\ hat {b}} _ {0 : 5}} = \ alpha {\ begin {pmatrix} 0,7 0,3 \\ 0,3 0,7 \ end {pmatrix}} {\ begin {pmatrix} 0,9 0,0 \\ 0,0 0,2 \ end {pmatrix} } {\ begin {pmatrix} 0,5923 \\ 0,4077 \ end {pmatrix}} = \ alpha {\ begin {pmatrix} 0,3976 \\ 0,2170 \ end {pmatrix}} = {\ begin {pmatrix} 0,6469 \\ 0,3531 \ end { pmatrix}}}\mathbf {{\hat {b}}_{0:5}} =\alpha {\begin{pmatrix}0.70.3\\0.30.7\end{pmatrix}}{\begin{pmatrix}0.90.0\\0.00.2\end{pmatrix}}{\begin{pmatrix}0.5923\\0.4077\end{pmatrix}}=\alpha {\begin{pmatrix}0.3976\\0.2170\end{pmatrix}}={\begin{pmatrix}0.6469\\0.3531\end{pmatrix}}

Наконец, мы вычислим сглаженные значения вероятности. Эти результаты также должны быть масштабированы так, чтобы сумма их записей равнялась 1, потому что мы не масштабировали обратные вероятности с помощью найденных ранее c t {\ displaystyle c_ {t}}c_{t}. Таким образом, приведенные выше обратные векторы вероятности фактически представляют вероятность каждого состояния в момент времени t с учетом будущих наблюдений. Поскольку эти векторы пропорциональны реальным обратным вероятностям, результат необходимо дополнительно масштабировать.

(γ 0) T = α (0,5000 0,5000) ∘ (0,6469 0,3531) = α (0,3235 0,1765) = (0,6469 0,3531) {\ displaystyle (\ mathbf {\ gamma _ {0}}) ^ {T} = \ alpha {\ begin {pmatrix} 0,5000 \\ 0,5000 \ end {pmatrix}} \ circ {\ begin {pmatrix} 0,6469 \ 0,3531 \ end {pmatrix}} = \ alpha {\ begin {pmatrix} 0,3235 \\ 0,1765 \ end {pmatrix}} = {\ begin {pmatrix} 0,6469 \\ 0,3531 \ end {pmatrix}}}(\mathbf {\gamma _{0}})^{T}=\alpha {\begin{pmatrix}0.5000\\0.5000\end{pmatrix}}\circ {\begin{pmatrix}0.6469\\0.3531\end{pmatrix}}=\alpha {\begin{pmatrix}0.3235\\0.1765\end{pmatrix}}={\begin{pmatrix}0.6469\\0.3531\end{pmatrix}}
(γ 1) T = α (0,8182 0,1818) ∘ (0,5923 0,4077) = α (0,4846 0,0741) = ( 0,8673 0,1327) {\ displaystyle (\ mathbf {\ gamma _ {1}}) ^ {T} = \ alpha {\ begin {pmatrix} 0,8182 \\ 0,1818 \ end {pmatrix}} \ circ {\ begin {pmatrix} 0,5923 \\ 0,4077 \ end {pmatrix}} = \ alpha {\ begin {pmatrix} 0,4846 \\ 0,0741 \ end {pmatrix}} = {\ begin {pmatrix} 0,8673 \\ 0,1327 \ end {pmatrix}}}(\mathbf {\gamma _{1}})^{T}=\alpha {\begin{pmatrix}0.8182\\0.1818\end{pmatrix}}\circ {\begin{pmatrix}0.5923\\0.4077\end{pmatrix}}=\alpha {\begin{pmatrix}0.4846\\0.0741\end{pmatrix}}={\begin{pmatrix}0.8673\\0.1327\end{pmatrix}}
( γ 2) T знак равно α (0,8834 0,1166) ∘ (0,3763 0,6237) = α (0,3324 0,0728) = (0,8204 0,1796) {\ displaystyle (\ mathbf {\ gamma _ {2}}) ^ {T} = \ alpha {\ begin {pmatrix} 0.8834 \\ 0.1166 \ end {pmatrix}} \ circ {\ begin {pmatrix} 0.3763 ​​\\ 0.6237 \ end {pmatrix}} = \ alpha {\ begin {pmatrix} 0.3324 \\ 0.0728 \ end {pmatrix} } = {\ begin {pmatrix} 0.8204 \\ 0,1796 \ end {pmatrix}}}(\mathbf {\gamma _{2}})^{T}=\alpha {\begin{pmatrix}0.8834\\0.1166\end{pmatrix}}\circ {\begin{pmatrix}0.3763\\0.6237\end{pmatrix}}=\alpha {\begin{pmatrix}0.3324\\0.0728\end{pmatrix}}={\begin{pmatrix}0.8204\\0.1796\end{pmatrix}}
(γ 3) T = α (0,1907 0,8093) ∘ (0,6533 0,3467) = α (0,1246 0,2806) = (0,3075 0,6925) {\ displaystyle (\ mathbf {\ гамма _ {3}}) ^ {T} = \ alpha {\ begin {pmatrix} 0,1907 \\ 0.8093 \ end {pmatrix}} \ circ {\ begin {pmatrix} 0,6533 \\ 0,3467 \ end {pmatrix}} = \ альфа {\ begin {pmatrix} 0,1246 \ 0,2806 \ end {pmatrix}} = {\ begin {pmatrix} 0,3075 \ 0,6925 \ end {pmatrix}}}(\mathbf {\gamma _{3}})^{T}=\alpha {\begin{pmatrix}0.1907\\0.8093\end{pmatrix}}\circ {\begin{pmatrix}0.6533\\0.3467\end{pmatrix}}=\alpha {\begin{pmatrix}0.1246\\0.2806\end{pmatrix}}={\begin{pmatrix}0.3075\\0.6925\end{pmatrix}}
(γ 4) T = α (0,7308 0,2692) ∘ (0,6273 0,3727) = α (0,4584 0,1003) = (0,8204 0,1796) {\ displaystyle (\ mathbf {\ gamma _ {4}}) ^ {T} = \ alpha {\ begin {pmatrix} 0,7308 \\ 0,2692 \ end { pmatrix}} \ circ {\ begin {pmatrix} 0,6273 \\ 0,3727 \ end {pmatrix}} = \ alpha {\ begin {pmatrix} 0,4584 \\ 0,1003 \ end {pmatrix}} = {\ begin {pmatrix} 0,8204 \\ 0,1796 \ end {pmatrix}}}(\mathbf {\gamma _{4}})^{T}=\alpha {\begin{pmatrix}0.7308\\0.2692\end{pmatrix}}\circ {\begin{pmatrix}0.6273\\0.3727\end{pmatrix}}=\alpha {\begin{pmatrix}0.4584\\0.1003\end{pmatrix}}={\begin{pmatrix}0.8204\\0.1796\end{pmatrix}}
(γ 5) T = α (0,8673 0,1327) ∘ (1,0000 1,0000) = α (0,8673 0,1327) = (0,8673 0,1327) {\ displaystyle (\ mathbf {\ gamma _ {5) }}) ^ {T} = \ alpha {\ begin {pmatrix} 0.8673 \\ 0.1327 \ end {pmatrix}} \ circ {\ begin {pmatrix} 1.0000 \\ 1.0000 \ end {pmatrix}} = \ alpha {\ begin {pmatrix} 0,8673 \\ 0,1327 \ en d {pmatrix}} = {\ begin {pmatrix} 0.8673 \\ 0.1327 \ end {pmatrix}}}(\mathbf {\gamma _{5}})^{T}=\alpha {\begin{pmatrix}0.8673\\0.1327\end{pmatrix}}\circ {\begin{pmatrix}1.0000\\1.0000\end{pmatrix}}=\alpha {\begin{pmatrix}0.8673\\0.1327\end{pmatrix}}={\begin{pmatrix}0.8673\\0.1327\end{pmatrix}}

Обратите внимание, что значение γ 0 {\ displaystyle \ mathbf {\ gamma _ {0}}}\mathbf {\gamma _{0}} равно b ^ 0: 5 {\ displaystyle \ mathbf {{\ hat {b}} _ {0: 5}}}\mathbf {{\hat {b}}_{0:5}} и что γ 5 {\ displaystyle \ mathbf {\ gamma _ {5}}}\mathbf {\gamma _{5}} равно f ^ 0: 5 {\ displaystyle \ mathbf {{\ hat {f}} _ {0: 5 }}}\mathbf {{\hat {f}}_{0:5}} . Это естественно, потому что и f ^ 0: 5 {\ displaystyle \ mathbf {{\ hat {f}} _ {0: 5}}}\mathbf {{\hat {f}}_{0:5}} , и b ^ 0: 5 { \ displaystyle \ mathbf {{\ hat {b}} _ {0: 5}}}\mathbf {{\hat {b}}_{0:5}} начинаются с единых априорных значений по векторам начального и конечного состояния (соответственно) и учитывают все наблюдения. Однако γ 0 {\ displaystyle \ mathbf {\ gamma _ {0}}}\mathbf {\gamma _{0}} будет равно только b ^ 0: 5 {\ displaystyle \ mathbf {{\ hat { b}} _ {0: 5}}}\mathbf {{\hat {b}}_{0:5}} , когда наш вектор начального состояния представляет собой однородный априор (т. е. все записи равны). Если это не так, b ^ 0: 5 {\ displaystyle \ mathbf {{\ hat {b}} _ {0: 5}}}\mathbf {{\hat {b}}_{0:5}} необходимо объединить с вектором начального состояния найти наиболее вероятное начальное состояние. Таким образом, мы находим, что прямых вероятностей самих по себе достаточно для расчета наиболее вероятного конечного состояния. Точно так же обратные вероятности могут быть объединены с вектором начального состояния, чтобы обеспечить наиболее вероятное начальное состояние с учетом наблюдений. Прямые и обратные вероятности нужно только объединить, чтобы вывести наиболее вероятные состояния между начальной и конечной точками.

Приведенные выше расчеты показывают, что наиболее вероятным состоянием погоды на каждый день, кроме третьего, был «дождь». Однако они говорят нам больше, поскольку теперь предоставляют способ количественной оценки вероятностей каждого состояния в разное время. Возможно, наиболее важным является то, что наше значение γ 5 {\ displaystyle \ mathbf {\ gamma _ {5}}}\mathbf {\gamma _{5}} количественно определяет наши знания вектора состояния в конце последовательности наблюдений. Затем мы можем использовать это, чтобы предсказать вероятность различных погодных условий завтра, а также вероятность наблюдения за зонтом.

Производительность

Алгоритм прямого и обратного направления работает с временной сложностью O (S 2 T) {\ displaystyle O (S ^ {2} T)}{\displaystyle O(S^{2}T)}в пространстве O (ST) {\ displaystyle O (ST)}{\displaystyle O(ST)}, где T {\ displaystyle T}T- длина временной последовательности, а S {\ displaystyle S}S- количество символов в государственном алфавите. Алгоритм также может работать в постоянном пространстве с временной сложностью O (S 2 T 2) {\ displaystyle O (S ^ {2} T ^ {2})}{\displaystyle O(S^{2}T^{2})}путем пересчета значений на каждом шаге.. Для сравнения, процедура грубой силы генерирует все возможные последовательности состояний ST {\ displaystyle S ^ {T}}{\displaystyle S^{T}}и вычисляет совместную вероятность каждой последовательности состояний с наблюдаемой серией событий, которая будет иметь временную сложность O (T ⋅ ST) {\ displaystyle O (T \ cdot S ^ {T})}{\displaystyle O(T\cdot S^{T})}. Грубая сила неразрешима для реалистичных задач, поскольку количество возможных последовательностей скрытых узлов обычно чрезвычайно велико.

Усовершенствованный алгоритм прямого и обратного направления, называемый островным алгоритмом, использует меньшее использование памяти для более длительного времени работы, принимая O (S 2 T log ⁡ T) { \ Displaystyle O (S ^ {2} T \ log T)}{\displaystyle O(S^{2}T\log T)}время и O (S 2 log ⁡ T) {\ displaystyle O (S ^ {2} \ log T)}{\displaystyle O(S^{2}\log T)}память. Кроме того, можно инвертировать модель процесса, чтобы получить O (S) {\ displaystyle O (S)}{\displaystyle O(S)}пробел, O (S 2 T) {\ displaystyle O ( S ^ {2} T)}{\displaystyle O(S^{2}T)}временной алгоритм, хотя инвертированный процесс может не существовать или плохо обусловлен.

Кроме того, были разработаны алгоритмы для вычисления f 0: t + 1 {\ displaystyle \ mathbf {f_ {0: t + 1}}}\mathbf {f_{0:t+1}} эффективно с помощью онлайн-сглаживания, такого как алгоритм сглаживания с фиксированной задержкой (FLS).

Псевдокод
алгоритм forward_backward isinput: guessState int sequenceIndex output: result если sequenceIndex находится за концом последовательности, то return 1 if(guessState, sequenceIndex) был замечен до, затемreturn сохраненный результат result: = 0 для каждого соседнего состояния n: result: = result + (вероятность перехода от guessState к n данному элементу наблюдения в sequenceIndex) × Backward (n, sequenceIndex + 1) сохранить результат для (guessState, sequence Index) return result
Пример Python

Учитывая HMM (как и в алгоритме Витерби ), представленный на языке программирования Python :

States = ('Здоровый', 'Лихорадка') end_state = 'E' Наблюдения = ('нормальный', 'холодный', 'головокружительный') start_probability = {'Здоровый': 0,6, 'Лихорадка »: 0,4} transition_probability = { «Здоровый»: {«Здоровый»: 0,69, «Лихорадка»: 0,3, «E»: 0,01}, «Лихорадка»: {«Здоровый»: 0,4, «Лихорадка»: 0,59, «E»: 0,01},} selection_probability = {'Здоровый': {'нормальный': 0,5, 'холодный': 0,4, 'головокружительный': 0,1}, 'Лихорадка': {'нормальный': 0,1, 'холодный': 0,3, 'головокружительный': 0,6}, }

Мы можем написать реализацию алгоритма вперед-назад следующим образом:

def fwd_bkw (наблюдения, состояния, start_prob, trans_prob, emm_prob, end_st): "" "Алгоритм вперед-назад." "" # Вперед. часть алгоритма fwd = для i, наблюдение_i в перечислении (наблюдения): f_curr = {} для st в состояниях: if i == 0: # базовый вариант для прямой части prev_f_sum = start_prob [st] else: prev_f_sum = sum ( f_ prev [k] * trans_prob [k] [st] для k в состоянии) f_curr [st] = emm_prob [st] [Наблюдение_i] * prev_f_sum fwd.append (f_curr) f_prev = f_curr p_fwd = sum (f_curr [k] * trans_prob [k] [end_st] для k в состояниях) # Обратная часть алгоритма bkw = для i, наблюдение_i_plus в enumerate (обратное (наблюдение [1:] + (None,))): b_curr = {} для st in состояний: if i == 0: # базовый вариант для обратной части b_curr [st] = trans_prob [st] [end_st] else: b_curr [st] = sum (trans_prob [st] [l] * emm_prob [l] [Наблюдение_i_plus] * b_prev [l] для l в состояниях) bkw.insert (0, b_curr) b_prev = b_curr p_bkw = sum (start_prob [l] * emm_prob [l] [наблюдения [0]] * b_curr [l] для l в состояниях) # Объединение две части posterior = для i в диапазоне (len (наблюдения)): posterior.append ({st: fwd [i] [st] * bkw [i] [st] / p_fwd for st in states}) assert p_fwd == p_bkw return fwd, bkw, posterior

The function fwd_bkwtakes the following arguments: xis the sequence of observations, eg ['normal', 'cold', 'dizzy']; statesis the set of hidden states; a_0is the start probability; aare the transition probabilities; and eare the emission probabilities.

For simplicity of code, we assume that the observation sequence xis non-empty and that a[i][j]and e[i][j]is defined for all states i,j.

In the running example, the forward-backward algorithm is used as follows:

def example(): return fwd_bkw(observations, states, start_probability, transition_probability, emission_probability, end_state)
>>>for line in example():... print(*line)... {'Healthy': 0.3, 'Fever': 0.04000000000000001} {'Healthy': 0.0892, 'Fever': 0.03408} {'Healthy': 0.007518, 'Fever': 0.028120319999999997} {'Healthy': 0.0010418399999999998, 'Fever': 0.00109578} {'Healthy': 0.00249, 'Fever': 0.00394} {'Healthy': 0.01, 'Fever': 0.01} {'Healthy': 0.8770110375573259, 'Fever': 0.1229889624426741} {'Healthy': 0.623228030950954, 'Fever': 0.3767719690490461} {'Healthy': 0.2109527048413057, 'Fever': 0.7890472951586943}
See also
References
  • Lawrence R. Rabiner, A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition. Proceedings of the IEEE, 77 (2), p. 257–286, February 1989. 10.1109/5.18626
  • Lawrence R. Rabiner, B. H. Juang (January 1986). "An introduction to hidden Markov models". IEEE ASSP Magazine: 4–15.
  • Eugene Charniak (1993). Statistical Language Learning. Кембридж, Массачусетс: MIT Press. ISBN 978-0-262-53141-2.
  • Stuart Russell and Peter Norvig (2010). Artificial Intelligence A Modern Approach 3rd Edition. Upper Saddle River, New Jersey: Pearson Education/Prentice-Hall. ISBN 978-0-13-604259-4.
External links
Последняя правка сделана 2021-05-20 12:26:35
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте