Алгоритм Баума-Велша — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Пример)
(Пример)
Строка 70: Строка 70:
 
|-
 
|-
 
! Состояние 1  
 
! Состояние 1  
|0.5 || 0.5
+
|<tex>0.5</tex> || <tex>0.5</tex>
 
|-
 
|-
 
! Состояние 2   
 
! Состояние 2   
|0.3 || 0.7
+
|<tex>0.3</tex> || <tex>0.7</tex>
 
|}
 
|}
 
||
 
||
Строка 82: Строка 82:
 
|-
 
|-
 
! Состояние 1  
 
! Состояние 1  
|0.3 || 0.7
+
|<tex>0.3</tex> || <tex>0.7</tex>
 
|-
 
|-
 
! Состояние 2   
 
! Состояние 2   
|0.8 || 0.2
+
|<tex>0.8</tex> || <tex>0.2</tex>
 
|}
 
|}
 
||
 
||
Строка 92: Строка 92:
 
|-
 
|-
 
! Состояние 1  
 
! Состояние 1  
|0.2
+
|<tex>0.2</tex>
 
|-
 
|-
 
! Состояние 2   
 
! Состояние 2   
|0.8
+
|<tex>0.8</tex>
 
|}
 
|}
 
|}
 
|}
Строка 109: Строка 109:
 
! Последовательность !! Вероятность последовательности и состояний !! Наибольшая вероятность наблюдения
 
! Последовательность !! Вероятность последовательности и состояний !! Наибольшая вероятность наблюдения
 
|-
 
|-
| NN || 0.024 || 0.3584 S2,S2
+
| <tex>NN</tex> || <tex>0.024</tex> || <tex>0.3584\,</tex>  <tex>S_2,</tex>  <tex>S_2</tex>
 
|-
 
|-
| NN || 0.024 || 0.3584 S2,S2
+
| <tex>NN</tex> || <tex>0.024</tex> || <tex>0.3584\,</tex>  <tex>S_2,</tex>  <tex>S_2</tex>
 
|-
 
|-
| NN || 0.024 || 0.3584 S2,S2
+
| <tex>NN</tex> || <tex>0.024</tex> || <tex>0.3584\,</tex>  <tex>S_2,</tex>  <tex>S_2</tex>
 
|-
 
|-
| NN || 0.024 || 0.3584 S2,S2
+
| <tex>NN</tex> || <tex>0.024</tex> || <tex>0.3584\,</tex>  <tex>S_2,</tex>  <tex>S_2</tex>
 
|-
 
|-
| NE || 0.006 || 0.1344 S2,S1
+
| <tex>NE</tex> || <tex>0.006</tex> || <tex>0.1344\,</tex>  <tex>S_2,</tex>  <tex>S_1</tex>
 
|-
 
|-
| EE || 0.014 || 0.0490 S1,S1
+
| <tex>EE</tex> || <tex>0.014</tex> || <tex>0.0490\,</tex>  <tex>S_1,</tex>  <tex>S_1</tex>
 
|-
 
|-
| EN || 0.056 || 0.0896 S2,S2
+
| <tex>EN</tex> || <tex>0.056</tex> || <tex>0.0896\,</tex>  <tex>S_2,</tex>  <tex>S_2</tex>
 
|-
 
|-
| NN || 0.024 || 0.3584 S2,S2
+
| <tex>NN</tex> || <tex>0.024</tex> || <tex>0.3584\,</tex>  <tex>S_2,</tex>  <tex>S_2</tex>
 
|-
 
|-
| NN || 0.024 || 0.3584 S2,S2
+
| <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>S1</tex> в <tex>S2</tex>, которая составляет <tex dpi="160">\dfrac{0.22}{2.4234}</tex><tex> = 0.0908</tex>. После этого можно подсчитать вероятность переходов из <tex>S2</tex> в <tex>S1</tex>, <tex>S2</tex> в <tex>S2</tex>, <tex>S1</tex> в <tex>S1</tex> и изменим их так, чтобы в суммы вероятностей давали 1. В итоге получаем новую матрицу переходов:
+
Таким образом получаем новую оценку перехода из <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>
 
<center>
Строка 144: Строка 144:
 
|-
 
|-
 
! Состояние 1  
 
! Состояние 1  
|0.5 || 0.5
+
|<tex>0.5</tex> ||<tex> 0.5</tex>
 
|-
 
|-
 
! Состояние 2   
 
! Состояние 2   
|0.3 || 0.7
+
|<tex>0.3 </tex>|| <tex>0.7</tex>
 
|}
 
|}
 
||
 
||
Строка 156: Строка 156:
 
|-
 
|-
 
! Состояние 1  
 
! Состояние 1  
|0.0598 || 0.0908
+
|<tex>0.0598</tex> || <tex>0.0908</tex>
 
|-
 
|-
 
! Состояние 2   
 
! Состояние 2   
|0.2179 || 0.9705
+
|<tex>0.2179</tex> ||<tex> 0.9705</tex>
 
|}
 
|}
 
||
 
||
Строка 168: Строка 168:
 
|-
 
|-
 
! Состояние 1  
 
! Состояние 1  
|0.3973 || 0.6027
+
|<tex>0.3973</tex> ||<tex> 0.6027</tex>
 
|-
 
|-
 
! Состояние 2   
 
! Состояние 2   
|0.1833 || 0.8167
+
|<tex>0.1833</tex> ||<tex> 0.8167</tex>
 
|}
 
|}
 
|}
 
|}
Строка 183: Строка 183:
 
! Последовательности !! Наибольшая вероятность наблюдения <br/> Если допустимо, что E получено из <tex>S1</tex> !! Наибольшая вероятность наблюдения
 
! Последовательности !! Наибольшая вероятность наблюдения <br/> Если допустимо, что E получено из <tex>S1</tex> !! Наибольшая вероятность наблюдения
 
|-
 
|-
| NE || 0.1344 S2,S1 || 0.1344 S2,S1
+
| <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>
 
|-
 
|-
| EE || 0.0490 S1,S1 || 0.0490 S1,S1
+
| <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>
 
|-
 
|-
| EN || 0.0560 S1,S2 || 0.0896 S1,S2
+
| <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>
 
|-
 
|-
 
! Итог
 
! Итог
| 0.2394 || 0.2730
+
| <tex>0.2394</tex> || <tex>0.2730</tex>
 
|}
 
|}
 
</center><br />
 
</center><br />
  
Новая оценка для E, полученная из <tex>S1</tex>, составляет <tex dpi="160">\dfrac{0.2394}{0.2730}</tex> <tex> = 0.8769</tex>.
+
Новая оценка для <tex>E</tex>, полученная из <tex>S_1</tex>, составляет <tex dpi="160">\dfrac{0.2394}{0.2730}</tex> <tex> = 0.8769</tex>.
  
 
Благодаря этому, возможно рассчитать матрицу состояний:
 
Благодаря этому, возможно рассчитать матрицу состояний:
Строка 208: Строка 208:
 
|-
 
|-
 
! Состояние 1  
 
! Состояние 1  
|0.3 || 0.7
+
|<tex>0.3</tex> || <tex>0.7</tex>
 
|-
 
|-
 
! Состояние 2   
 
! Состояние 2   
|0.8 || 0.2
+
|<tex>0.8</tex> || <tex>0.2</tex>
 
|}
 
|}
 
||
 
||
Строка 220: Строка 220:
 
|-
 
|-
 
! Состояние 1  
 
! Состояние 1  
|0.0876 || 0.8769
+
|<tex>0.0876</tex> || <tex>0.8769</tex>
 
|-
 
|-
 
! Состояние 2   
 
! Состояние 2   
|1.0000 || 0.7385
+
|<tex>1.0000</tex> ||<tex> 0.7385</tex>
 
|}
 
|}
 
||
 
||
Строка 232: Строка 232:
 
|-
 
|-
 
! Состояние 1  
 
! Состояние 1  
|0.0908 || 0.9092
+
|<tex>0.0908</tex> || <tex>0.9092</tex>
 
|-
 
|-
 
! Состояние 2   
 
! Состояние 2   
|0.5752 || 0.4248
+
|<tex>0.5752</tex> || <tex>0.4248</tex>
 
|}
 
|}
 
|}
 
|}
 
</center>
 
</center>
  
Для оценки начальной вероятности, мы предполагаем, что все последовательности начаты со скрытого состояния <tex>S1</tex> и рассчитаны с высокой вероятностью, а затем повторяем для <tex>S2</tex>. После нормализации получаем обновленный исходный вектор.
+
Для оценки начальной вероятности, мы предполагаем, что все последовательности начаты со скрытого состояния <tex>S_1</tex> и рассчитаны с высокой вероятностью, а затем повторяем для <tex>S_2</tex>. После нормализации получаем обновленный исходный вектор.
  
 
Повторяем эти шаги до тех пор, пока вероятности не сойдутся.
 
Повторяем эти шаги до тех пор, пока вероятности не сойдутся.

Версия 15:11, 8 марта 2018

Алгоритм Баума-Велша (англ. Baum–Welch algorithm) — алгоритм для нахождения неизвестных параметров скрытой Марковской модели. Использует алгоритм прямого-обратного хода.

История

Скрытые Марковские модели (HMMs) и алгоритм Баума-Велша впервые были описаны в заметках Леонарда Баума и его сверстников в конце [math]1960[/math]. Одно из первых основных приложений на основе HMMs было использовано в области обработки речи. В [math]1980[/math] HMMs стало эффективным инструментом в анализе биологических систем и информации, особенно в генном анализе.

Описание алгоритма

Пусть [math]Q_t[/math] — это дискретная случайная переменная, принимающая одно из [math]N[/math] значений [math](1..N)[/math]. Будем полагать, что данная модель Маркова, определенная как [math]P(Q_t | Q_{t - 1})[/math] однородна по времени, то есть независима от [math]t[/math]. Тогда можно задать [math]P(Q_t \mid Q_{t - 1}) [/math] как независящую от времени стохастическую матрицу перемещений [math]A = \{a_{ij}\} = p(Q_t = j \mid Q_{t - 1} = i)[/math]. Особый случай для времени [math]t = 1[/math] определяется начальным распределением [math]\pi_i = P(Q_1 = i)[/math].

Будем считать, что мы в состоянии [math]j[/math] в момент времени [math]t[/math], если [math]Q_t = j[/math]. Последовательность заданных состояний определяется как [math]q = \{q_1 \dots q_T \}[/math], где [math]q_t \in \{ 1\ldots N\}[/math] является состоянием в момент времени [math]t[/math].

Наблюдение может иметь одно из [math]L[/math] возможных значений, [math]Q_t \in \{o_1 \dots o_L\}[/math]. Вероятность заданного вектора наблюдений в момент времени [math]t[/math] для состояния [math]j[/math] определяется как [math]b_j(o_t) = P(O_t = o_t \mid Q_t = j)\ ( B = \{ b_{ij}\}[/math] — это матрица [math]L[/math] на [math]N)[/math]. Заданная последовательность наблюдений [math]O[/math] выражается как [math] O = (O_1 = o_1, \dots ,O_T = o_T)[/math].

Следовательно, мы можем описать скрытую модель Маркова с помощью [math] \lambda = (A, B, \pi)[/math]. При заданном векторе наблюдений [math]O[/math] алгоритм Баума-Велша находит [math] \lambda^*=\max_\lambda P(O\mid\lambda)[/math]. [math]\lambda[/math] максимизирует вероятность наблюдений [math]O[/math].


Исходные данные: [math] \lambda = (A, B, \pi)[/math] со случайными начальными условиями. Алгоритм итеративно обновляет параметр [math]\lambda[/math] до схождения в одной точке.


Прямая процедура

[math]a_i(t) = p(O_1 = o_1 \dots O_t = o_t, Q_t = \lambda_i )[/math], что является вероятностью получения заданной последовательности [math]\{ o_1 \dots o_t \}[/math] для состояния [math]i[/math] в момент времени [math]t[/math].

[math]a_i(t)[/math] можно вычислить рекурсивно:

1.[math]a_i(1) = \pi_i \cdot b_i(O_1) [/math];

2.[math]a_j(t + 1) = b_j(O_{t + 1})\displaystyle\sum^N_{i=1}a_i(t) \cdot a_{ij}[/math].

Обратная процедура

Данная процедура позволяет вычислить вероятность конечной заданной последовательности [math]\{ o_{t + 1} \dots o_T \}[/math] при условии, что мы начали из исходного состояния [math]i[/math], в момент времени [math]t[/math].

[math]\beta_i(t)[/math] можно вычислить рекурсивно:

1.[math]\beta_i(T) = 1[/math];

2. [math]\beta_i(t) = \displaystyle\sum^N_{j = 1}\beta_j(t + 1)a_{ij}b_j(O_{t + 1})[/math].

Обновление переменных

Определим временные переменные:

[math]\gamma_i(t) = p(Q_t=i\mid O,\;\lambda)=[/math] [math]\dfrac{\alpha_i(t)\beta_i(t)}{\displaystyle\sum^N_{j=1}\alpha_j(t)\beta_j(t)}[/math]

[math]\xi_{ij}(t) = p(Q_t=i,\;Q_{t+1}=j\mid O,\;\lambda)=[/math] [math]\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})}[/math].

Имея [math]\gamma[/math] и [math]\xi[/math], можно определить:

[math]\bar\pi_i=\gamma_i(1)[/math],

[math]\bar{a}_{ij}=\dfrac{\displaystyle\sum^{T-1}_{t=1}\xi_{ij}(t)}{\displaystyle\sum^{T-1}_{t=1}\gamma_i(t)}[/math],

[math]\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)}[/math].

Используя новые переменные [math] A, B, \pi[/math] итерации продолжаются до схождения.

Пример

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

Переходы
Состояние 1 Состояние 2
Состояние 1 [math]0.5[/math] [math]0.5[/math]
Состояние 2 [math]0.3[/math] [math]0.7[/math]
Состояния
Яйца не отложены Яйца отложены
Состояние 1 [math]0.3[/math] [math]0.7[/math]
Состояние 2 [math]0.8[/math] [math]0.2[/math]
Начальное состояние
Состояние 1 [math]0.2[/math]
Состояние 2 [math]0.8[/math]

Рассмотрим набор наблюдений ([math]E[/math] — яйца отложены, [math]N[/math] — яйца не отложены): [math]NN, NN, NN, NN, NE, EE, EN, NN, NN[/math].

Следующим шагом оценим новую матрицу переходов:

Последовательность Вероятность последовательности и состояний Наибольшая вероятность наблюдения
[math]NN[/math] [math]0.024[/math] [math]0.3584\,[/math] [math]S_2,[/math] [math]S_2[/math]
[math]NN[/math] [math]0.024[/math] [math]0.3584\,[/math] [math]S_2,[/math] [math]S_2[/math]
[math]NN[/math] [math]0.024[/math] [math]0.3584\,[/math] [math]S_2,[/math] [math]S_2[/math]
[math]NN[/math] [math]0.024[/math] [math]0.3584\,[/math] [math]S_2,[/math] [math]S_2[/math]
[math]NE[/math] [math]0.006[/math] [math]0.1344\,[/math] [math]S_2,[/math] [math]S_1[/math]
[math]EE[/math] [math]0.014[/math] [math]0.0490\,[/math] [math]S_1,[/math] [math]S_1[/math]
[math]EN[/math] [math]0.056[/math] [math]0.0896\,[/math] [math]S_2,[/math] [math]S_2[/math]
[math]NN[/math] [math]0.024[/math] [math]0.3584\,[/math] [math]S_2,[/math] [math]S_2[/math]
[math]NN[/math] [math]0.024[/math] [math]0.3584\,[/math] [math]S_2,[/math] [math]S_2[/math]
Итог [math]0.22[/math] [math]2.4234[/math]

Таким образом получаем новую оценку перехода из [math]S_1[/math] в [math]S_2[/math], которая составляет [math]\dfrac{0.22}{2.4234}[/math][math] = 0.0908[/math]. После этого можно подсчитать вероятность переходов из [math]S_2[/math] в [math]S_1[/math], [math]S_2[/math] в [math]S_2[/math], [math]S_1[/math] в [math]S_1[/math] и изменим их так, чтобы в суммы вероятностей давали [math]1[/math]. В итоге получаем новую матрицу переходов:

Старая матрица
Состояние 1 Состояние 2
Состояние 1 [math]0.5[/math] [math] 0.5[/math]
Состояние 2 [math]0.3 [/math] [math]0.7[/math]
Новая матрица (Псевдовероятности)
Состояние 1 Состояние 2
Состояние 1 [math]0.0598[/math] [math]0.0908[/math]
Состояние 2 [math]0.2179[/math] [math] 0.9705[/math]
Новая матрица (После изменения)
Состояние 1 Состояние 2
Состояние 1 [math]0.3973[/math] [math] 0.6027[/math]
Состояние 2 [math]0.1833[/math] [math] 0.8167[/math]

Далее оценим новую матрицу состояний:

Последовательности Наибольшая вероятность наблюдения
Если допустимо, что E получено из [math]S1[/math]
Наибольшая вероятность наблюдения
[math]NE[/math] [math]0.1344\,[/math] [math] S_2, [/math] [math]S_1[/math] [math]0.1344\,[/math] [math]S_2,[/math][math] S_1[/math]
[math]EE[/math] [math]0.0490\,[/math] [math] S_1, [/math] [math]S_1[/math] [math]0.0490\,[/math] [math]S_1,[/math][math] S_1[/math]
[math]EN[/math] [math]0.0560\,[/math] [math] S_1, [/math] [math]S_2[/math] [math]0.0896\,[/math] [math]S_1,[/math] [math]S_2[/math]
Итог [math]0.2394[/math] [math]0.2730[/math]

Новая оценка для [math]E[/math], полученная из [math]S_1[/math], составляет [math]\dfrac{0.2394}{0.2730}[/math] [math] = 0.8769[/math].

Благодаря этому, возможно рассчитать матрицу состояний:

Старая матрица
Яйца не отложены Яйца отложены
Состояние 1 [math]0.3[/math] [math]0.7[/math]
Состояние 2 [math]0.8[/math] [math]0.2[/math]
Новая матрица (Оценка)
Яйца не отложены Яйца отложены
Состояние 1 [math]0.0876[/math] [math]0.8769[/math]
Состояние 2 [math]1.0000[/math] [math] 0.7385[/math]
Новая матрица (После изменения)
Яйца не отложены Яйца отложены
Состояние 1 [math]0.0908[/math] [math]0.9092[/math]
Состояние 2 [math]0.5752[/math] [math]0.4248[/math]

Для оценки начальной вероятности, мы предполагаем, что все последовательности начаты со скрытого состояния [math]S_1[/math] и рассчитаны с высокой вероятностью, а затем повторяем для [math]S_2[/math]. После нормализации получаем обновленный исходный вектор.

Повторяем эти шаги до тех пор, пока вероятности не сойдутся.

Псевдокод

 // T — конечный момент времени
 int[] DynamicOptionalStateSequance([math]\lambda[/math], d):
     double [math]\gamma[/math][1, i] = [math]\pi[/math][i] * b[i, d[1]]
     int [math]\psi[/math][1, i] = []
     int ans[]
     for t = 2 to T
         for i = 1 to n
             if [math]\gamma[/math][t, j] < [math]\gamma[/math][t - 1, i] * a[i, j] * b[j, d[t]]
                 [math]\gamma[/math][t, j] = [math]\gamma[/math][t - 1, i] * a[i, j] * b[j, d[t]]
                 [math]\psi[/math][t, j] = i
     ans[T] = 1 
     for i = 2 to n
         if [math]\gamma[/math][T, i] > [math]\gamma[/math][T, i - 1]
             ans[T] = i    
     for t = T - 1 downto 1
         ans[t] = [math]\psi[/math][t + 1, ans[t + 1]]
 return ans

См. также

Источники информации