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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
== История ==
 
== История ==
 
Алгоритм Витерби был представлен в 1967 году для декодирования сверточных кодов, поступающих через зашумленный канал связи. В 1969 году Омура (Omura) показал, что основу алгоритма Витерби составляет оценка максимума правдоподобия.
 
Алгоритм Витерби был представлен в 1967 году для декодирования сверточных кодов, поступающих через зашумленный канал связи. В 1969 году Омура (Omura) показал, что основу алгоритма Витерби составляет оценка максимума правдоподобия.
== Применение ==
+
 
Алгоритм используется в CDMA и GSM цифровой связи, в модемах и космических коммуникациях. Он нашел применение в распознавании речи и письма, компьютерной лингвистике и биоинформатике, а также в алгоритме свёрточного декодирования Витерби.
 
 
== Описание ==
 
== Описание ==
 
Алгоритм Витерби позволяет сделать наилучшее предположение о последовательности состояний скрытой модели на основе последовательности наблюдений. Эта последовательность состояний называется путем Витерби.
 
Алгоритм Витерби позволяет сделать наилучшее предположение о последовательности состояний скрытой модели на основе последовательности наблюдений. Эта последовательность состояний называется путем Витерби.
 
{{Определение
 
{{Определение
 
|id=def1.  
 
|id=def1.  
|definition=Путь Витерби наиболее правдоподобная последовательность скрытых состояний.
+
|definition='''Путь Витерби''' {{---}} наиболее правдоподобная последовательность скрытых состояний.
 
}}
 
}}
  
Пусть задано пространство наблюдений <tex>O =\{o_1,o_2...o_N\}</tex>, пространство состояний <tex>S =\{s_1,s_2...s_K\}</tex>, последовательность наблюдений <tex>Y =\{y_1,y_2...y_T\}</tex>, матрица <tex>A</tex> переходов из <tex>i</tex>-того состояния в <tex>j</tex>-ое, размером <tex>K*K</tex>, матрица эмиссии В размера <tex>K*N</tex>, которая определяет вероятность наблюдения <tex>o_j</tex> из состояния <tex>s_i</tex>, массив начальных вероятностей <tex>\pi\,\!</tex> размером <tex>K</tex>, показывающий вероятность того, что начальное состояние <tex>s_i</tex>. Путь <tex>Х =\{x_1,x_2...x_T\}</tex> последовательность состояний, которые привели к последовательности наблюдений <tex>Y</tex>.
+
Пусть задано пространство наблюдений <tex>O =\{o_1,o_2...o_N\}</tex>, пространство состояний <tex>S =\{s_1,s_2...s_K\}</tex>, последовательность наблюдений <tex>Y =\{y_1,y_2...y_T\}</tex>, матрица <tex>A</tex> переходов из <tex>i</tex>-того состояния в <tex>j</tex>-ое, размером <tex>K \times K</tex>, матрица эмиссии <tex> B </tex> размера <tex>K \times N</tex>, которая определяет вероятность наблюдения <tex>o_j</tex> из состояния <tex>s_i</tex>, массив начальных вероятностей <tex>\pi</tex> размером <tex>K</tex>, показывающий вероятность того, что начальное состояние <tex>s_i</tex>. Путь <tex>X =\{x_1,x_2...x_T\}</tex> {{---}} последовательность состояний, которые привели к последовательности наблюдений <tex>Y</tex>.
  
 
'''Скрытая марковская модель.'''
 
'''Скрытая марковская модель.'''
Строка 19: Строка 18:
  
 
Рассмотрим пример скрытой марковской модели. У Деда Мороза есть три мешка с подарками в разноцветной упаковке: красной, синей, зеленой и фиолетовой. Ночью Дед Мороз  пробирается в квартиру и тайком  выкладывает подарки под елкой в ряд, доставая по одному подарку из мешка. Наутро мы обнаруживаем упорядоченную последовательность из пяти подарков и хотим сделать наилучшее предположение о последовательности мешков, из которых он доставал эти подарки.  
 
Рассмотрим пример скрытой марковской модели. У Деда Мороза есть три мешка с подарками в разноцветной упаковке: красной, синей, зеленой и фиолетовой. Ночью Дед Мороз  пробирается в квартиру и тайком  выкладывает подарки под елкой в ряд, доставая по одному подарку из мешка. Наутро мы обнаруживаем упорядоченную последовательность из пяти подарков и хотим сделать наилучшее предположение о последовательности мешков, из которых он доставал эти подарки.  
Дед Мороз с мешками скрытая марковская модель. При этом 4 цвета - пространство из <tex>N</tex> наблюдений, 3 мешка количество состояний <tex>K</tex>, 5 подарков наши <tex>T</tex> наблюдений, каждое из которых представлено цифрой номером цвета от 1 до 5. Мы знаем, каковы вероятности того, что Дед Мороз начнет доставать подарки из мешка с номером <tex>i</tex> вектор <tex>\pi[i]\,\!</tex>. Мы также знаем матрицу переходов <tex>A</tex>, какова вероятность того, что от мешка с номером <tex>i</tex> Дед Мороз переходит к мешку с номером <tex>j</tex>. Мешки Деда Мороза бесконечны, но мы точно знаем, каково соотношение цветов подарков в кажом мешке ему загрузили на заводе в Великом Устюге. Это матрица вероятностей эмиссии <tex>B</tex>.  
+
Дед Мороз с мешками {{---}} скрытая марковская модель. При этом 4 цвета {{---}} пространство из <tex>N</tex> наблюдений, 3 мешка {{---}} количество состояний <tex>K</tex>, 5 подарков {{---}} наши <tex>T</tex> наблюдений, каждое из которых представлено цифрой {{---}} номером цвета {{---}} от 1 до 5. Мы знаем, каковы вероятности того, что Дед Мороз начнет доставать подарки из мешка с номером <tex>i</tex> {{---}} вектор <tex>\pi[i]</tex>. Мы также знаем матрицу переходов <tex>A</tex>, какова вероятность того, что от мешка с номером <tex>i</tex> Дед Мороз переходит к мешку с номером <tex>j</tex>. Мешки Деда Мороза бесконечны, но мы точно знаем, каково соотношение цветов подарков в кажом мешке ему загрузили на заводе в Великом Устюге. Это матрица вероятностей эмиссии <tex>B</tex>.  
  
 
== Алгоритм ==
 
== Алгоритм ==
Создадим две матрицы <tex>T_1</tex> и <tex>T_2</tex> размером <tex>K*T</tex>. Каждый элемент <tex>T_1[i,j]</tex> содержит вероятность того, что на <tex>j</tex>-ом шаге мы находимся в состоянии <tex>s_i</tex>. Каждый элемент <tex>T_2[i,j]</tex> содержит индекс наиболее вероятного состояния на <tex>{j-1}</tex>-ом шаге.  
+
Создадим две матрицы <tex>TState</tex> и <tex>TIndex</tex> размером <tex>K \times T</tex>. Каждый элемент <tex>TState[i,j]</tex> содержит вероятность того, что на <tex>j</tex>-ом шаге мы находимся в состоянии <tex>s_i</tex>. Каждый элемент <tex>TIndex[i,j]</tex> содержит индекс наиболее вероятного состояния на <tex>{j-1}</tex>-ом шаге.  
 
   
 
   
'''Шаг 1.''' Заполним первый столбец матриц <tex>T_1</tex> на основании начального распределения, и <tex>T_2</tex> нулями.
+
'''Шаг 1.''' Заполним первый столбец матриц <tex>TState</tex> на основании начального распределения, и <tex>TIndex</tex> нулями.
  
'''Шаг 2.''' Последовательно заполняем следующие столбцы матриц <tex>T_1</tex> и <tex>T_2</tex>, используя матрицы вероятностей эмиссий и переходов.   
+
'''Шаг 2.''' Последовательно заполняем следующие столбцы матриц <tex>TState</tex> и <tex>TIndex</tex>, используя матрицы вероятностей эмиссий и переходов.   
  
'''Шаг 3.''' Рассматривая максимальные значения в столбцах матрицы <tex>T_2</tex>, начиная с последнего столбца, выдаем ответ.
+
'''Шаг 3.''' Рассматривая максимальные значения в столбцах матрицы <tex>TIndex</tex>, начиная с последнего столбца, выдаем ответ.
  
 
== Псевдокод ==
 
== Псевдокод ==
    //функция возвращает вектор <tex>X</tex> - последовательность номеров наиболее вероятных состояний, которые привели к данным наблюдениям.  
+
<code>
    function viterbi <tex>(O,S,\pi\,\!,Y,A,B)</tex>
+
  //функция возвращает вектор X {{---}} последовательность номеров наиболее вероятных состояний, которые привели к данным наблюдениям.  
        for <tex>i=1..K</tex>
+
  '''viterbi''' (O, S, <tex> \pi </tex>, Y, A, B)  
            <tex>T_1[i,1]\longleftarrow\pi[i]\,\cdot B[i,Y[i]]</tex>
+
      '''for''' i = 1..K
            <tex>T_2[i,1]\longleftarrow0</tex>
+
          TState[i, 1] = <tex> \pi </tex>[i] * B[i, Y[i]]
        for <tex>i=2 .. T</tex>
+
          TIndex[i, 1] = 0
            for <tex>j=1..K</tex>
+
      '''for''' i = 2..T
                <tex>T_1[j,i]\longleftarrow \max_{1 \leqslant k\leqslant K} \limits {(T_1[k,i-1]\cdot A[k,j]\cdot B[j,Y[i]])}</tex>
+
          '''for''' j = 1..K
                <tex>T_2[j,i]\longleftarrow\arg\max_{1 \leqslant k\leqslant K} \limits {(T_1[k,i-1]\cdot A[k,j]\cdot B[j,Y[i]])}</tex>
+
              TState[j, i] = <tex> \max_{1 \leqslant k\leqslant K} \limits </tex>(TState[k, i - 1] * A[k, j] * B[j, Y[i]])  
                //функция arg max() ищет максимум выражения в скобках, возвращает аргумент (в нашем случае <tex>k</tex>), при котором достигается этот максимум.
+
              TIndex[j, i] = <tex> \arg\max_{1 \leqslant k\leqslant K} \limits </tex>(TState[k, i - 1] * A[k, j] * B[j, Y[i]])  
        <tex>X[T]\longleftarrow\arg\max_{1 \leqslant k\leqslant K} \limits {(T_1[k,T])}</tex>
+
              //функция arg max() ищет максимум выражения в скобках и возвращает аргумент (в нашем случае <tex>k</tex>), при котором достигается этот максимум.
        for <tex>i=T...2</tex>
+
      X[T] = <tex> \arg\max_{1 \leqslant k\leqslant K} \limits </tex>(TState[k, T])  
            <tex>X[i-1]\longleftarrow T_2[X[i],i]</tex>
+
      '''for''' i = T...2
        return <tex>X</tex>
+
          X[i - 1] = TIndex[X[i], i]
 +
      '''return''' X
 +
</code>
  
 +
Таким образом, алгоритму требуется <tex> O(T\times\left|{S}\right|^2)</tex> времени.
  
Таким образом, алгоритму требуется <tex> O(T\times\left|{S}\right|^2)</tex> времени.
+
== Применение ==
 +
Алгоритм используется в CDMA и GSM цифровой связи, в модемах и космических коммуникациях. Он нашел применение в распознавании речи и письма, компьютерной лингвистике и биоинформатике, а также в алгоритме свёрточного декодирования Витерби.
  
 
== Ссылки ==
 
== Ссылки ==
*[http://en.wikipedia.org/wiki/Viterbi_algorithm Wikipedia-Viterbi algorithm]
+
* [[wikipedia:Viterbi_algorithm|Wikipedia {{---}} Viterbi algorithm]]
*[http://www.cs.sfu.ca/~oschulte/teaching/726/spring11/slides/mychapter13b.pdf Презентация]
+
* [http://www.cs.sfu.ca/~oschulte/teaching/726/spring11/slides/mychapter13b.pdf Презентация]
[[Категория: Дискретная математика и алгоритмы]][[Категория: Марковские цепи]]
+
 
 +
[[Категория: Дискретная математика и алгоритмы]]
 +
[[Категория: Марковские цепи]]
 +
[[Категория: Динамическое программирование]]

Версия 04:38, 14 января 2013

История

Алгоритм Витерби был представлен в 1967 году для декодирования сверточных кодов, поступающих через зашумленный канал связи. В 1969 году Омура (Omura) показал, что основу алгоритма Витерби составляет оценка максимума правдоподобия.

Описание

Алгоритм Витерби позволяет сделать наилучшее предположение о последовательности состояний скрытой модели на основе последовательности наблюдений. Эта последовательность состояний называется путем Витерби.

Определение:
Путь Витерби — наиболее правдоподобная последовательность скрытых состояний.


Пусть задано пространство наблюдений [math]O =\{o_1,o_2...o_N\}[/math], пространство состояний [math]S =\{s_1,s_2...s_K\}[/math], последовательность наблюдений [math]Y =\{y_1,y_2...y_T\}[/math], матрица [math]A[/math] переходов из [math]i[/math]-того состояния в [math]j[/math]-ое, размером [math]K \times K[/math], матрица эмиссии [math] B [/math] размера [math]K \times N[/math], которая определяет вероятность наблюдения [math]o_j[/math] из состояния [math]s_i[/math], массив начальных вероятностей [math]\pi[/math] размером [math]K[/math], показывающий вероятность того, что начальное состояние [math]s_i[/math]. Путь [math]X =\{x_1,x_2...x_T\}[/math] — последовательность состояний, которые привели к последовательности наблюдений [math]Y[/math].

Скрытая марковская модель.

Модель представляет из себя марковскую цепь, для которой нам известны начальная вероятность и матрица вероятностей переходов. Скрытой она называется потому, что мы не имеем информации о ее текущем состоянии. Мы получаем информацию на основе некоторого наблюдения, в рассмотренном ниже алгоритме мы будем использовать просто натуральное число от 1 до [math]N[/math], как индекс наблюдаемого события. Для каждого состояния скрытой марковской модели задан вектор вероятности эмиссии, который характеризует вероятность наблюдени каждого события, когда модель находится в этом состоянии. Совокупность таких векторов образует матрицу эмиссии.

Пример скрытой марковской модели.

Рассмотрим пример скрытой марковской модели. У Деда Мороза есть три мешка с подарками в разноцветной упаковке: красной, синей, зеленой и фиолетовой. Ночью Дед Мороз пробирается в квартиру и тайком выкладывает подарки под елкой в ряд, доставая по одному подарку из мешка. Наутро мы обнаруживаем упорядоченную последовательность из пяти подарков и хотим сделать наилучшее предположение о последовательности мешков, из которых он доставал эти подарки. Дед Мороз с мешками — скрытая марковская модель. При этом 4 цвета — пространство из [math]N[/math] наблюдений, 3 мешка — количество состояний [math]K[/math], 5 подарков — наши [math]T[/math] наблюдений, каждое из которых представлено цифрой — номером цвета — от 1 до 5. Мы знаем, каковы вероятности того, что Дед Мороз начнет доставать подарки из мешка с номером [math]i[/math] — вектор [math]\pi[i][/math]. Мы также знаем матрицу переходов [math]A[/math], какова вероятность того, что от мешка с номером [math]i[/math] Дед Мороз переходит к мешку с номером [math]j[/math]. Мешки Деда Мороза бесконечны, но мы точно знаем, каково соотношение цветов подарков в кажом мешке ему загрузили на заводе в Великом Устюге. Это матрица вероятностей эмиссии [math]B[/math].

Алгоритм

Создадим две матрицы [math]TState[/math] и [math]TIndex[/math] размером [math]K \times T[/math]. Каждый элемент [math]TState[i,j][/math] содержит вероятность того, что на [math]j[/math]-ом шаге мы находимся в состоянии [math]s_i[/math]. Каждый элемент [math]TIndex[i,j][/math] содержит индекс наиболее вероятного состояния на [math]{j-1}[/math]-ом шаге.

Шаг 1. Заполним первый столбец матриц [math]TState[/math] на основании начального распределения, и [math]TIndex[/math] нулями.

Шаг 2. Последовательно заполняем следующие столбцы матриц [math]TState[/math] и [math]TIndex[/math], используя матрицы вероятностей эмиссий и переходов.

Шаг 3. Рассматривая максимальные значения в столбцах матрицы [math]TIndex[/math], начиная с последнего столбца, выдаем ответ.

Псевдокод

 //функция возвращает вектор X — последовательность номеров наиболее вероятных состояний, которые привели к данным наблюдениям. 
 viterbi (O, S, [math] \pi [/math], Y, A, B) 
     for i = 1..K
         TState[i, 1] = [math] \pi [/math][i] * B[i, Y[i]]
         TIndex[i, 1] = 0
     for i = 2..T
         for j = 1..K
             TState[j, i] = [math] \max_{1 \leqslant k\leqslant K} \limits [/math](TState[k, i - 1] * A[k, j] * B[j, Y[i]]) 
             TIndex[j, i] = [math] \arg\max_{1 \leqslant k\leqslant K} \limits [/math](TState[k, i - 1] * A[k, j] * B[j, Y[i]]) 
             //функция arg max() ищет максимум выражения в скобках и возвращает аргумент (в нашем случае [math]k[/math]), при котором достигается этот максимум.
     X[T] = [math] \arg\max_{1 \leqslant k\leqslant K} \limits [/math](TState[k, T]) 
     for i = T...2
         X[i - 1] = TIndex[X[i], i]
     return X

Таким образом, алгоритму требуется [math] O(T\times\left|{S}\right|^2)[/math] времени.

Применение

Алгоритм используется в CDMA и GSM цифровой связи, в модемах и космических коммуникациях. Он нашел применение в распознавании речи и письма, компьютерной лингвистике и биоинформатике, а также в алгоритме свёрточного декодирования Витерби.

Ссылки