1632
правки
Изменения
м
''__TOC__'''Алгоритм Баума-Велша'''(англ. ''Baum–Welch algorithm'' ) — алгоритм для нахождения неизвестных параметров [[Скрытые_Марковские_модели | скрытой Марковской модели]]. Использует [[Алгоритм_"Вперед-Назад" | алгоритм прямого-обратного хода]].
2. *[http://logicen.pdmiwikipedia.ras.ruorg/~sergeywiki/teaching/asr/notes-09-hmm.pdfBaum%E2%80%93Welch_algorithm Wikipedia — Baum–Welch algorithm]
3. http[[Категория://en.wikipedia.org/wiki/Baum%E2%80%93Welch_algorithmДискретная математика и алгоритмы]][[Категория: Марковские цепи]]
rollbackEdits.php mass rollback
==История==
[[Скрытые_Марковские_модели | Скрытые Марковские модели]](англ. ''Hidden Markov Models'', ''HMMs'') и алгоритм Баума-Велша впервые были описаны в заметках Леонарда Баума и его сверстников в конце 1960х<tex>1960</tex> годов. Одно из первых основных приложений на основе HMMs было использовано в области обработки речи. В 1980х <tex>1980</tex> годах HMMs стало стали эффективным инструментом в анализе биологических систем и информации, особенно в генном анализе.
== Описание алгоритма==
Пусть <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 = (\{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, ..., \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>a_i(t) = p(O_1 = o_1, ..., \dots O_t = o_t, Q_t = _i | \lambdalambda_i )</tex>, что является вероятностью получения заданной последовательности <tex>\{ o_1, ..., \dots o_t\}</tex> для состояния <tex>i</tex> в момент времени <tex>t</tex>.
<tex>a_i(t)</tex> можно вычислить рекурсивно:
<tex>1.\,</tex> <tex>a_i(1) = \pi_i \cdot b_i(O_1) </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}, ..., \dots o_T\}</tex> при условии, что мы начали из исходного состояния <tex>i</tex>, в момент времени <tex>t</tex>.
<tex>\beta_i(t)</tex> можно вычислить рекурсивно:
<tex>1.\,</tex> <tex>\beta_i(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>.
=== Обновление переменных ===
Определим временные переменные:
<tex>\gamma_i(t) = p(Q_t=i\mid O,\;\lambda)=</tex> <tex dpi="160">\fracdfrac{\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> <tex dpi="160">\fracdfrac{\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>\bar\pi_i=\gamma_i(1)</tex>,
<tex>\bar{a}_{ij}=\fracdfrac{\displaystyle\sum^{T-1}_{t=1}\xi_{ij}(t)}{\displaystyle\sum^{T-1}_{t=1}\gamma_i(t)}</tex>,
<tex>\bar{b}_i(k)=\fracdfrac{\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> итерации продолжаются до схождения.
== Пример ==
Предположим, у нас есть курица, с которой мы собираем яйца. Куриные Снесла ли это курица яйца - — зависит от некоторых неизвестных факторов. Для простоты предположим, что существуют лишь два состояния, которые определяют куриные есть ли это яйца. В начальный момент нам неизвестно текущее состояние, также нам неизвестна вероятность перехода из одного состояния в другое. Для начала возьмем произвольные матрицы переходов и состояний.
<center>
|+Переходы
|-
! !! Состояние <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>
|}
||
! !! Яйца не отложены !! Яйца отложены
|-
! Состояние <tex>1 </tex>|<tex>0.3 </tex> || <tex>0.7</tex>
|-
! Состояние <tex>2 </tex>|<tex>0.8 </tex> || <tex>0.2</tex>
|}
||
|+ Начальное состояние
|-
! Состояние <tex>1 </tex> |<tex>0.2</tex>
|-
! Состояние <tex>2 </tex> |<tex>0.8</tex>
|}
|}
</center><br />
Рассмотрим набор наблюдений (<tex>E - </tex> — яйца отложены, <tex>N - </tex> — яйца не отложены): <tex>NN, NN, NN, NN, NE, EE, EN, NN, NN</tex>.
Следующим шагом оценим новую матрицу переходов:
{| class="wikitable"
|-
! Последовательность !! Вероятность последовательности и состояний S1 и S2 !! Наибольшая вероятность наблюдения
|-
| <tex>NN </tex> || <tex>0.024 </tex> || <tex>0.3584 S2\,S2</tex> <tex>S_2,</tex> <tex>S_2</tex>
|-
| <tex>NN </tex> || <tex>0.024 </tex> || <tex>0.3584 S2\,S2</tex> <tex>S_2,</tex> <tex>S_2</tex>
|-
| <tex>NN </tex> || <tex>0.024 </tex> || <tex>0.3584 S2\,S2</tex> <tex>S_2,</tex> <tex>S_2</tex>
|-
| <tex>NN </tex> || <tex>0.024 </tex> || <tex>0.3584 S2\,S2</tex> <tex>S_2,</tex> <tex>S_2</tex>
|-
| <tex>NE </tex> || <tex>0.006 </tex> || <tex>0.1344 S2\,S1</tex> <tex>S_2,</tex> <tex>S_1</tex>
|-
| <tex>EE </tex> || <tex>0.014 </tex> || <tex>0.0490 S1\,S1</tex> <tex>S_1,</tex> <tex>S_1</tex>
|-
| <tex>EN </tex> || <tex>0.056 </tex> || <tex>0.0896 S2\,S2</tex> <tex>S_2,</tex> <tex>S_2</tex>
|-
| <tex>NN </tex> || <tex>0.024 </tex> || <tex>0.3584 S2\,S2</tex> <tex>S_2,</tex> <tex>S_2</tex>
|-
| <tex>NN </tex> || <tex>0.024 </tex> || <tex>0.3584 S2\,S2</tex> <tex>S_2,</tex> <tex>S_2</tex>
|-
! ИтогоИтог| <tex>0.22 </tex> || <tex>2.4234</tex>
|}
</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): '''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 Лекция "Скрытые Марковские Модели" Сергея Николенко]