Алгоритм Баума-Велша — различия между версиями
(→Пример) |
м (rollbackEdits.php mass rollback) |
||
(не показано 55 промежуточных версий 8 участников) | |||
Строка 1: | Строка 1: | ||
− | + | __TOC__ | |
+ | '''Алгоритм Баума-Велша''' (англ. ''Baum–Welch algorithm'') — алгоритм для нахождения неизвестных параметров [[Скрытые_Марковские_модели | скрытой Марковской модели]]. Использует [[Алгоритм_"Вперед-Назад" | алгоритм прямого-обратного хода]]. | ||
==История== | ==История== | ||
− | [[Скрытые Марковские модели | + | [[Скрытые_Марковские_модели | Скрытые Марковские модели]] (англ. ''Hidden Markov Models'', ''HMMs'') и алгоритм Баума-Велша впервые были описаны в заметках Леонарда Баума и его сверстников в конце <tex>1960</tex> годов. Одно из первых основных приложений на основе HMMs было использовано в области обработки речи. В <tex>1980</tex> годах HMMs стали эффективным инструментом в анализе биологических систем и информации, особенно в генном анализе. |
== Описание алгоритма== | == Описание алгоритма== | ||
− | Пусть <tex>Q_t</tex> | + | Пусть <tex>Q_t</tex> — это дискретная случайная переменная, принимающая одно из <tex>N</tex> значений <tex>(1 \ldots N)</tex>. Будем полагать, что данная модель Маркова, определенная как <tex>P(Q_t \mid Q_{t - 1})</tex> однородна по времени, то есть независима от <tex>t</tex>. Тогда можно задать <tex>P(Q_t \mid Q_{t - 1}) </tex> как независящую от времени стохастическую матрицу перемещений <tex>A = \{a_{ij}\} = p(Q_t = j \mid Q_{t - 1} = i)</tex>. Особый случай для времени <tex>t = 1</tex> определяется начальным распределением <tex>\pi_i = P(Q_1 = i)</tex>. |
− | Будем считать, что мы в состоянии <tex>j</tex> в момент времени <tex>t</tex>, если <tex>Q_t = j</tex>. Последовательность заданных состояний определяется как <tex>q = | + | Будем считать, что мы в состоянии <tex>j</tex> в момент времени <tex>t</tex>, если <tex>Q_t = j</tex>. Последовательность заданных состояний определяется как <tex>q = \{q_1 \dots q_T \}</tex>, где <tex>q_t \in \{ 1\ldots N\}</tex> является состоянием в момент времени <tex>t</tex>. |
− | Наблюдение может иметь одно из <tex>L</tex> возможных значений, <tex>Q_t \in \{o_1 | + | Наблюдение может иметь одно из <tex>L</tex> возможных значений, <tex>Q_t \in \{o_1 \dots o_L\}</tex>. Вероятность заданного вектора наблюдений в момент времени <tex>t</tex> для состояния <tex>j</tex> определяется как <tex>b_j(o_t) = P(O_t = o_t \mid Q_t = j)\ ( B = \{ b_{ij}\}</tex> — это матрица <tex>L</tex> на <tex>N)</tex>. Заданная последовательность наблюдений <tex>O</tex> выражается как <tex> O = (O_1 = o_1, \dots ,O_T = o_T)</tex>. |
Следовательно, мы можем описать скрытую модель Маркова с помощью <tex> \lambda = (A, B, \pi)</tex>. При заданном векторе наблюдений <tex>O</tex> алгоритм Баума-Велша находит <tex> \lambda^*=\max_\lambda P(O\mid\lambda)</tex>. <tex>\lambda</tex> максимизирует вероятность наблюдений <tex>O</tex>. | Следовательно, мы можем описать скрытую модель Маркова с помощью <tex> \lambda = (A, B, \pi)</tex>. При заданном векторе наблюдений <tex>O</tex> алгоритм Баума-Велша находит <tex> \lambda^*=\max_\lambda P(O\mid\lambda)</tex>. <tex>\lambda</tex> максимизирует вероятность наблюдений <tex>O</tex>. | ||
Строка 21: | Строка 22: | ||
=== Прямая процедура === | === Прямая процедура === | ||
− | <tex>a_i(t) = p(O_1 = o_1 | + | <tex>a_i(t) = p(O_1 = o_1 \dots O_t = o_t, Q_t = \lambda_i )</tex>, что является вероятностью получения заданной последовательности <tex>\{ o_1 \dots o_t \}</tex> для состояния <tex>i</tex> в момент времени <tex>t</tex>. |
<tex>a_i(t)</tex> можно вычислить рекурсивно: | <tex>a_i(t)</tex> можно вычислить рекурсивно: | ||
− | 1.<tex>a_i(1) = \pi_i \cdot b_i(O_1) </tex>; | + | <tex>1.\,</tex> <tex>a_i(1) = \pi_i \cdot b_i(O_1) </tex>; |
− | 2.<tex>a_j(t + 1) = b_j(O_{t + 1})\displaystyle\sum^N_{i=1}a_i(t) \cdot a_{ij}</tex>. | + | <tex>2.\,</tex> <tex>a_j(t + 1) = b_j(O_{t + 1})\displaystyle\sum^N_{i=1}a_i(t) \cdot a_{ij}</tex>. |
=== Обратная процедура === | === Обратная процедура === | ||
− | Данная процедура позволяет вычислить вероятность конечной заданной последовательности <tex>o_{t + 1} | + | Данная процедура позволяет вычислить вероятность конечной заданной последовательности <tex>\{ o_{t + 1} \dots o_T \}</tex> при условии, что мы начали из исходного состояния <tex>i</tex>, в момент времени <tex>t</tex>. |
<tex>\beta_i(t)</tex> можно вычислить рекурсивно: | <tex>\beta_i(t)</tex> можно вычислить рекурсивно: | ||
− | 1.<tex>\beta_i(T) = 1</tex>; | + | <tex>1.\,</tex> <tex>\beta_i(T) = 1</tex>; |
− | 2. <tex>\beta_i(t) = \displaystyle\sum^N_{j = 1}\beta_j(t + 1)a_{ij}b_j(O_{t + 1})</tex>. | + | <tex>2.\,</tex> <tex>\beta_i(t) = \displaystyle\sum^N_{j = 1}\beta_j(t + 1)a_{ij}b_j(O_{t + 1})</tex>. |
=== Обновление переменных === | === Обновление переменных === | ||
Строка 43: | Строка 44: | ||
Определим временные переменные: | Определим временные переменные: | ||
− | <tex>\gamma_i(t) = p(Q_t=i\mid O,\;\lambda)=\ | + | <tex>\gamma_i(t) = p(Q_t=i\mid O,\;\lambda)=</tex> <tex dpi="160">\dfrac{\alpha_i(t)\beta_i(t)}{\displaystyle\sum^N_{j=1}\alpha_j(t)\beta_j(t)}</tex> |
− | <tex>\xi_{ij}(t) = p(Q_t=i,\;Q_{t+1}=j\mid O,\;\lambda)=\ | + | <tex>\xi_{ij}(t) = p(Q_t=i,\;Q_{t+1}=j\mid O,\;\lambda)=</tex> <tex dpi="160">\dfrac{\alpha_i(t)a_{ij}\beta_j(t+1)b_j(o_{t+1})}{\displaystyle\sum^N_{i=1}\displaystyle\sum^N_{j=1}\alpha_i(t)a_{ij}\beta_j(t+1)b_j(O_{t+1})}</tex>. |
Имея <tex>\gamma</tex> и <tex>\xi</tex>, можно определить: | Имея <tex>\gamma</tex> и <tex>\xi</tex>, можно определить: | ||
Строка 51: | Строка 52: | ||
<tex>\bar\pi_i=\gamma_i(1)</tex>, | <tex>\bar\pi_i=\gamma_i(1)</tex>, | ||
− | <tex>\bar{a}_{ij}=\ | + | <tex>\bar{a}_{ij}=\dfrac{\displaystyle\sum^{T-1}_{t=1}\xi_{ij}(t)}{\displaystyle\sum^{T-1}_{t=1}\gamma_i(t)}</tex>, |
− | <tex>\bar{b}_i(k)=\ | + | <tex>\bar{b}_i(k)=\dfrac{\displaystyle\sum^T_{t=1}\delta_{O_t,\;o_k}\gamma_i(t)}{\displaystyle\sum^T_{t=1}\gamma_i(t)}</tex>. |
Используя новые переменные <tex> A, B, \pi</tex> итерации продолжаются до схождения. | Используя новые переменные <tex> A, B, \pi</tex> итерации продолжаются до схождения. | ||
== Пример == | == Пример == | ||
− | Предположим, у нас есть курица, с которой мы собираем яйца. | + | Предположим, у нас есть курица, с которой мы собираем яйца. Снесла ли курица яйца — зависит от некоторых неизвестных факторов. Для простоты предположим, что существуют лишь два состояния, которые определяют есть ли яйца. В начальный момент нам неизвестно текущее состояние, также нам неизвестна вероятность перехода из одного состояния в другое. Для начала возьмем произвольные матрицы переходов и состояний. |
<center> | <center> | ||
Строка 67: | Строка 68: | ||
|+Переходы | |+Переходы | ||
|- | |- | ||
− | ! !! Состояние 1 !! Состояние | + | ! !! Состояние <tex>1</tex> !! Состояние <tex>2</tex> |
|- | |- | ||
− | ! Состояние 1 | + | ! Состояние <tex>1</tex> |
− | |0.5 || 0.5 | + | |<tex>0.5</tex> || <tex>0.5</tex> |
|- | |- | ||
− | ! Состояние 2 | + | ! Состояние <tex>2</tex> |
− | |0.3 || 0.7 | + | |<tex>0.3</tex> || <tex>0.7</tex> |
|} | |} | ||
|| | || | ||
Строка 81: | Строка 82: | ||
! !! Яйца не отложены !! Яйца отложены | ! !! Яйца не отложены !! Яйца отложены | ||
|- | |- | ||
− | ! Состояние 1 | + | ! Состояние <tex>1</tex> |
− | |0.3 || 0.7 | + | |<tex>0.3</tex> || <tex>0.7</tex> |
|- | |- | ||
− | ! Состояние 2 | + | ! Состояние <tex>2</tex> |
− | |0.8 || 0.2 | + | |<tex>0.8</tex> || <tex>0.2</tex> |
|} | |} | ||
|| | || | ||
Строка 91: | Строка 92: | ||
|+ Начальное состояние | |+ Начальное состояние | ||
|- | |- | ||
− | ! Состояние 1 | + | ! Состояние <tex>1</tex> |
− | |0.2 | + | |<tex>0.2</tex> |
|- | |- | ||
− | ! Состояние 2 | + | ! Состояние <tex>2</tex> |
− | |0.8 | + | |<tex>0.8</tex> |
|} | |} | ||
|} | |} | ||
</center><br /> | </center><br /> | ||
− | Рассмотрим набор наблюдений (E | + | Рассмотрим набор наблюдений (<tex>E</tex> — яйца отложены, <tex>N</tex> — яйца не отложены): <tex>NN, NN, NN, NN, NE, EE, EN, NN, NN</tex>. |
Следующим шагом оценим новую матрицу переходов: | Следующим шагом оценим новую матрицу переходов: | ||
Строка 107: | Строка 108: | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
− | ! Последовательность !! Вероятность последовательности и состояний | + | ! Последовательность !! Вероятность последовательности и состояний !! Наибольшая вероятность наблюдения |
|- | |- | ||
− | | NN || 0.024 || 0.3584 | + | | <tex>NN</tex> || <tex>0.024</tex> || <tex>0.3584\,</tex> <tex>S_2,</tex> <tex>S_2</tex> |
|- | |- | ||
− | | NN || 0.024 || 0.3584 | + | | <tex>NN</tex> || <tex>0.024</tex> || <tex>0.3584\,</tex> <tex>S_2,</tex> <tex>S_2</tex> |
|- | |- | ||
− | | NN || 0.024 || 0.3584 | + | | <tex>NN</tex> || <tex>0.024</tex> || <tex>0.3584\,</tex> <tex>S_2,</tex> <tex>S_2</tex> |
|- | |- | ||
− | | NN || 0.024 || 0.3584 | + | | <tex>NN</tex> || <tex>0.024</tex> || <tex>0.3584\,</tex> <tex>S_2,</tex> <tex>S_2</tex> |
|- | |- | ||
− | | NE || 0.006 || 0.1344 | + | | <tex>NE</tex> || <tex>0.006</tex> || <tex>0.1344\,</tex> <tex>S_2,</tex> <tex>S_1</tex> |
|- | |- | ||
− | | EE || 0.014 || 0.0490 | + | | <tex>EE</tex> || <tex>0.014</tex> || <tex>0.0490\,</tex> <tex>S_1,</tex> <tex>S_1</tex> |
|- | |- | ||
− | | EN || 0.056 || 0.0896 | + | | <tex>EN</tex> || <tex>0.056</tex> || <tex>0.0896\,</tex> <tex>S_2,</tex> <tex>S_2</tex> |
|- | |- | ||
− | | NN || 0.024 || 0.3584 | + | | <tex>NN</tex> || <tex>0.024</tex> || <tex>0.3584\,</tex> <tex>S_2,</tex> <tex>S_2</tex> |
|- | |- | ||
− | | NN || 0.024 || 0.3584 | + | | <tex>NN</tex> || <tex>0.024</tex> || <tex>0.3584\,</tex> <tex>S_2,</tex> <tex>S_2</tex> |
|- | |- | ||
− | ! | + | ! Итог |
− | | 0.22 || 2.4234 | + | | <tex>0.22</tex> || <tex>2.4234</tex> |
|} | |} | ||
</center><br /> | </center><br /> | ||
+ | |||
+ | Таким образом получаем новую оценку перехода из <tex>S_1</tex> в <tex>S_2</tex>, которая составляет <tex dpi="160">\dfrac{0.22}{2.4234}</tex><tex> = 0.0908</tex>. После этого можно подсчитать вероятность переходов из <tex>S_2</tex> в <tex>S_1</tex>, <tex>S_2</tex> в <tex>S_2</tex>, <tex>S_1</tex> в <tex>S_1</tex> и изменим их так, чтобы в суммы вероятностей давали <tex>1</tex>. В итоге получаем новую матрицу переходов: | ||
+ | |||
+ | <center> | ||
+ | {| border="0" style="background:transparent;" | ||
+ | |- | ||
+ | | | ||
+ | {| class="wikitable" | ||
+ | |+Старая матрица | ||
+ | |- | ||
+ | ! !! Состояние <tex>1</tex> !! Состояние <tex>2</tex> | ||
+ | |- | ||
+ | ! Состояние <tex>1</tex> | ||
+ | |<tex>0.5</tex> ||<tex> 0.5</tex> | ||
+ | |- | ||
+ | ! Состояние <tex>2</tex> | ||
+ | |<tex>0.3 </tex>|| <tex>0.7</tex> | ||
+ | |} | ||
+ | || | ||
+ | {| class="wikitable" | ||
+ | |+Новая матрица (Псевдовероятности) | ||
+ | |- | ||
+ | ! !! Состояние <tex>1</tex> !! Состояние <tex>2</tex> | ||
+ | |- | ||
+ | ! Состояние <tex>1</tex> | ||
+ | |<tex>0.0598</tex> || <tex>0.0908</tex> | ||
+ | |- | ||
+ | ! Состояние <tex>2</tex> | ||
+ | |<tex>0.2179</tex> ||<tex> 0.9705</tex> | ||
+ | |} | ||
+ | || | ||
+ | {| class="wikitable" | ||
+ | |+Новая матрица (После изменения) | ||
+ | |- | ||
+ | ! !! Состояние <tex>1</tex> !! Состояние <tex>2</tex> | ||
+ | |- | ||
+ | ! Состояние <tex>1</tex> | ||
+ | |<tex>0.3973</tex> ||<tex> 0.6027</tex> | ||
+ | |- | ||
+ | ! Состояние <tex>2</tex> | ||
+ | |<tex>0.1833</tex> ||<tex> 0.8167</tex> | ||
+ | |} | ||
+ | |} | ||
+ | </center> | ||
+ | |||
+ | Далее оценим новую матрицу состояний: | ||
+ | |||
+ | <center> | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! Последовательности !! Наибольшая вероятность наблюдения <br/> Если допустимо, что E получено из <tex>S_1</tex> !! Наибольшая вероятность наблюдения | ||
+ | |- | ||
+ | | <tex>NE</tex> || <tex>0.1344\,</tex> <tex> S_2, </tex> <tex>S_1</tex> || <tex>0.1344\,</tex> <tex>S_2,</tex><tex> S_1</tex> | ||
+ | |- | ||
+ | | <tex>EE</tex> || <tex>0.0490\,</tex> <tex> S_1, </tex> <tex>S_1</tex> || <tex>0.0490\,</tex> <tex>S_1,</tex><tex> S_1</tex> | ||
+ | |- | ||
+ | | <tex>EN</tex> || <tex>0.0560\,</tex> <tex> S_1, </tex> <tex>S_2</tex> || <tex>0.0896\,</tex> <tex>S_1,</tex> <tex>S_2</tex> | ||
+ | |- | ||
+ | ! Итог | ||
+ | | <tex>0.2394</tex> || <tex>0.2730</tex> | ||
+ | |} | ||
+ | </center><br /> | ||
+ | |||
+ | Новая оценка для <tex>E</tex>, полученная из <tex>S_1</tex>, составляет <tex dpi="160">\dfrac{0.2394}{0.2730}</tex> <tex> = 0.8769</tex>. | ||
+ | |||
+ | Благодаря этому, возможно рассчитать матрицу состояний: | ||
+ | |||
+ | <center> | ||
+ | {| border="0" style="background:transparent;" | ||
+ | |- | ||
+ | | | ||
+ | {| class="wikitable" | ||
+ | |+Старая матрица | ||
+ | |- | ||
+ | ! !! Яйца не отложены !! Яйца отложены | ||
+ | |- | ||
+ | ! Состояние <tex>1</tex> | ||
+ | |<tex>0.3</tex> || <tex>0.7</tex> | ||
+ | |- | ||
+ | ! Состояние <tex>2</tex> | ||
+ | |<tex>0.8</tex> || <tex>0.2</tex> | ||
+ | |} | ||
+ | || | ||
+ | {| class="wikitable" | ||
+ | |+Новая матрица (Оценка) | ||
+ | |- | ||
+ | ! !! Яйца не отложены !! Яйца отложены | ||
+ | |- | ||
+ | ! Состояние <tex>1</tex> | ||
+ | |<tex>0.0876</tex> || <tex>0.8769</tex> | ||
+ | |- | ||
+ | ! Состояние <tex>2</tex> | ||
+ | |<tex>1.0000</tex> ||<tex> 0.7385</tex> | ||
+ | |} | ||
+ | || | ||
+ | {| class="wikitable" | ||
+ | |+Новая матрица (После изменения) | ||
+ | |- | ||
+ | ! !! Яйца не отложены !! Яйца отложены | ||
+ | |- | ||
+ | ! Состояние <tex>1</tex> | ||
+ | |<tex>0.0908</tex> || <tex>0.9092</tex> | ||
+ | |- | ||
+ | ! Состояние <tex>2</tex> | ||
+ | |<tex>0.5752</tex> || <tex>0.4248</tex> | ||
+ | |} | ||
+ | |} | ||
+ | </center> | ||
+ | |||
+ | Для оценки начальной вероятности, мы предполагаем, что все последовательности начаты со скрытого состояния <tex>S_1</tex> и рассчитаны с высокой вероятностью, а затем повторяем для <tex>S_2</tex>. После нормализации получаем обновленный исходный вектор. | ||
+ | |||
+ | Повторяем эти шаги до тех пор, пока вероятности не сойдутся. | ||
== Псевдокод == | == Псевдокод == | ||
− | == | + | <font color="green">// T — конечный момент времени</font> |
− | == | + | '''int'''[] DynamicOptionalStateSequance(<tex>\lambda</tex>, d): |
− | 1. https://ru.wikipedia.org/wiki/ | + | '''double''' <tex>\gamma</tex>[1, i] = <tex>\pi</tex>[i] * b[i, d[1]] |
+ | '''int''' <tex>\psi</tex>[1, i] = [] | ||
+ | '''int''' ans[] | ||
+ | '''for''' t = 2 '''to''' T | ||
+ | '''for''' i = 1 '''to''' n | ||
+ | '''if''' <tex>\gamma</tex>[t, j] < <tex>\gamma</tex>[t - 1, i] * a[i, j] * b[j, d[t]] | ||
+ | <tex>\gamma</tex>[t, j] = <tex>\gamma</tex>[t - 1, i] * a[i, j] * b[j, d[t]] | ||
+ | <tex>\psi</tex>[t, j] = i | ||
+ | ans[T] = 1 | ||
+ | '''for''' i = 2 '''to''' n | ||
+ | '''if''' <tex>\gamma</tex>[T, i] > <tex>\gamma</tex>[T, i - 1] | ||
+ | ans[T] = i | ||
+ | '''for''' t = T - 1 '''downto''' 1 | ||
+ | ans[t] = <tex>\psi</tex>[t + 1, ans[t + 1]] | ||
+ | '''return''' ans | ||
+ | |||
+ | == См. также == | ||
+ | |||
+ | *[[Скрытые Марковские модели]] | ||
+ | *[[Алгоритм "Вперед-Назад"]] | ||
+ | *[[Алгоритм Витерби]] | ||
+ | |||
+ | == Источники информации== | ||
+ | *[https://ru.wikipedia.org/wiki/Алгоритм_Баума_—_Велша Википедия — Алгоритм Баума-Велша] | ||
+ | |||
+ | *[http://logic.pdmi.ras.ru/~sergey/teaching/asr/notes-09-hmm.pdf Лекция "Скрытые Марковские Модели" Сергея Николенко] | ||
− | + | *[http://en.wikipedia.org/wiki/Baum%E2%80%93Welch_algorithm Wikipedia — Baum–Welch algorithm] | |
− | + | [[Категория: Дискретная математика и алгоритмы]] | |
+ | [[Категория: Марковские цепи]] |
Текущая версия на 19:31, 4 сентября 2022
Содержание
Алгоритм Баума-Велша (англ. Baum–Welch algorithm) — алгоритм для нахождения неизвестных параметров скрытой Марковской модели. Использует алгоритм прямого-обратного хода.
История
Скрытые Марковские модели (англ. Hidden Markov Models, HMMs) и алгоритм Баума-Велша впервые были описаны в заметках Леонарда Баума и его сверстников в конце годов. Одно из первых основных приложений на основе HMMs было использовано в области обработки речи. В годах HMMs стали эффективным инструментом в анализе биологических систем и информации, особенно в генном анализе.
Описание алгоритма
Пусть
— это дискретная случайная переменная, принимающая одно из значений . Будем полагать, что данная модель Маркова, определенная как однородна по времени, то есть независима от . Тогда можно задать как независящую от времени стохастическую матрицу перемещений . Особый случай для времени определяется начальным распределением .Будем считать, что мы в состоянии
в момент времени , если . Последовательность заданных состояний определяется как , где является состоянием в момент времени .Наблюдение может иметь одно из
возможных значений, . Вероятность заданного вектора наблюдений в момент времени для состояния определяется как — это матрица на . Заданная последовательность наблюдений выражается как .Следовательно, мы можем описать скрытую модель Маркова с помощью
. При заданном векторе наблюдений алгоритм Баума-Велша находит . максимизирует вероятность наблюдений .
Исходные данные:
со случайными начальными условиями. Алгоритм итеративно обновляет параметр до схождения в одной точке.
Прямая процедура
, что является вероятностью получения заданной последовательности для состояния в момент времени .
можно вычислить рекурсивно:
;
.
Обратная процедура
Данная процедура позволяет вычислить вероятность конечной заданной последовательности
при условии, что мы начали из исходного состояния , в момент времени .можно вычислить рекурсивно:
;
.
Обновление переменных
Определим временные переменные:
.
Имея
и , можно определить:,
,
.
Используя новые переменные
итерации продолжаются до схождения.Пример
Предположим, у нас есть курица, с которой мы собираем яйца. Снесла ли курица яйца — зависит от некоторых неизвестных факторов. Для простоты предположим, что существуют лишь два состояния, которые определяют есть ли яйца. В начальный момент нам неизвестно текущее состояние, также нам неизвестна вероятность перехода из одного состояния в другое. Для начала возьмем произвольные матрицы переходов и состояний.
|
|
|
Рассмотрим набор наблюдений (
— яйца отложены, — яйца не отложены): .Следующим шагом оценим новую матрицу переходов:
Последовательность | Вероятность последовательности и состояний | Наибольшая вероятность наблюдения |
---|---|---|
Итог |
Таким образом получаем новую оценку перехода из
в , которая составляет . После этого можно подсчитать вероятность переходов из в , в , в и изменим их так, чтобы в суммы вероятностей давали . В итоге получаем новую матрицу переходов:
|
|
|
Далее оценим новую матрицу состояний:
Последовательности | Наибольшая вероятность наблюдения Если допустимо, что E получено из |
Наибольшая вероятность наблюдения |
---|---|---|
Итог |
Новая оценка для
, полученная из , составляет .Благодаря этому, возможно рассчитать матрицу состояний:
|
|
|
Для оценки начальной вероятности, мы предполагаем, что все последовательности начаты со скрытого состояния
и рассчитаны с высокой вероятностью, а затем повторяем для . После нормализации получаем обновленный исходный вектор.Повторяем эти шаги до тех пор, пока вероятности не сойдутся.
Псевдокод
// T — конечный момент времени int[] DynamicOptionalStateSequance(, d): double [1, i] = [i] * b[i, d[1]] int [1, i] = [] int ans[] for t = 2 to T for i = 1 to n if [t, j] < [t - 1, i] * a[i, j] * b[j, d[t]] [t, j] = [t - 1, i] * a[i, j] * b[j, d[t]] [t, j] = i ans[T] = 1 for i = 2 to n if [T, i] > [T, i - 1] ans[T] = i for t = T - 1 downto 1 ans[t] = [t + 1, ans[t + 1]] return ans