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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Пример)
(Пример)
Строка 182: Строка 182:
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
! Последовательности !! Наибольшая вероятность наблюдения <br/> Если допустимо, что E получено из <tex>S1</tex> !! Наибольшая вероятность наблюдения
+
! Последовательности !! Наибольшая вероятность наблюдения <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>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>

Версия 10:16, 15 марта 2018

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

История

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

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

Пусть [math]Q_t[/math] — это дискретная случайная переменная, принимающая одно из [math]N[/math] значений [math](1 \ldots N)[/math]. Будем полагать, что данная модель Маркова, определенная как [math]P(Q_t \mid 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] можно вычислить рекурсивно:

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

[math]2.\,[/math] [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] можно вычислить рекурсивно:

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

[math]2.\,[/math] [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] итерации продолжаются до схождения.

Пример

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

Переходы
Состояние [math]1[/math] Состояние [math]2[/math]
Состояние [math]1[/math] [math]0.5[/math] [math]0.5[/math]
Состояние [math]2[/math] [math]0.3[/math] [math]0.7[/math]
Состояния
Яйца не отложены Яйца отложены
Состояние [math]1[/math] [math]0.3[/math] [math]0.7[/math]
Состояние [math]2[/math] [math]0.8[/math] [math]0.2[/math]
Начальное состояние
Состояние [math]1[/math] [math]0.2[/math]
Состояние [math]2[/math] [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]. В итоге получаем новую матрицу переходов:

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

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

Последовательности Наибольшая вероятность наблюдения
Если допустимо, что E получено из [math]S_1[/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].

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

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

См. также

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