Алгоритм Витерби

Материал из Викиконспекты
Перейти к: навигация, поиск

История

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

Определение:
Сверточный код (англ. Convolutional code ) — это корректирующий ошибки код, в котором
  1. На каждом такте работы кодера k символов входной полубесконечной последовательности преобразуются в n>k символов выходной
  2. Также в преобразовании участвуют m предыдущих символов
  3. Выполняется свойство линейности (если x соответствует X, а y соответствует Y, то ax+by соответствует aX+bY).


Описание

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

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

Предположения, которые делает алгоритм:

  1. Скрытые и наблюдаемые события должны быть последовательностью, которая упорядочена по времени.
  2. Каждое скрытое событие должно соответствовать только одному наблюдаемому.
  3. Вычисление наиболее вероятной скрытой последовательности до момента t зависит только от наблюдаемого события в этот момент времени и наиболее вероятной последовательности до момента t1 (динамическое программирование).

Алгоритм

Входные данные:

  1. Пространство наблюдений O={o1,o2oN}
  2. Пространство состояний S={s1,s2sK}
  3. Последовательность наблюдений Y={y1,y2yT}
  4. Матрица A переходов из i-того состояния в j-ое, размером K×K
  5. Матрица эмиссии B размера K×N, которая определяет вероятность наблюдения oj из состояния si
  6. Массив начальных вероятностей π размером K, показывающий вероятность того, что начальное состояние si

Выходные данные:

X={x1,x2xT} — последовательность состояний, которые привели к последовательности наблюдений Y.

Алгоритм:

Создадим две матрицы TState и TIndex размером K×T. Каждый элемент TState[i,j] содержит вероятность того, что на j-ом шаге мы находимся в состоянии si. Каждый элемент TIndex[i,j] содержит индекс наиболее вероятного состояния на j1-ом шаге.

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

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

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

Доказательство корректности:

Наиболее вероятная последовательность скрытых состояний получается следующими реккурентными соотношениями:

  • V1,k=P(y1k)πk
  • Vt,k=maxxS(P(ytk)Ax,kVt1,x)

Где Vt,k это вероятность наиболее вероятной последовательности, которая ответственна за первые t наблюдений, у которых k является завершающим состоянием. Путь Витерби может быть получен сохранением обратных указателей, которые помнят какое состояние было использовано во втором равенстве. Пусть Ptr(k,t) — функция, которая возвращает значение x, использованное для подсчета Vt,k если t>1, или k если t=1. Тогда:

  • xT=xS:VT,xmax
  • xt1=Ptr(xt,t)

Псевдокод

Функция возвращает вектор X : последовательность номеров наиболее вероятных состояний, которые привели к данным наблюдениям.

   Viterbi(O,S,P,Y,A,B)
       for j=1 to K
           TState[i,1]=P[i]B[i,Y[1]]
           TIndex[i,1]=0
       for i=2 to T
           for j=1 to K
               TIndex[j,i]=argmax1 
               // функция arg max() возвращает аргумент(в нашем случае \mathtt{k}), при котором достигается этот максимум
               \mathtt{TState}[\mathtt{j}, \mathtt{i}] = \mathtt{TState}[\mathtt{TIndex}[\mathtt{j}, \mathtt{i}], \mathtt{i} - 1] * \mathtt{A}[\mathtt{k}, \mathtt{j}] * \mathtt{B}[\mathtt{j}, \mathtt{Y}[\mathtt{i}]]  
       \mathtt{X}[\mathtt{T}] = \arg\max_{1 \leqslant \mathtt{k}\leqslant \mathtt{K}} \limits (\mathtt{TState}[\mathtt{k}, \mathtt{T}]) 
       for \mathtt{i} = \mathtt{T} downto 2
           \mathtt{X}[\mathtt{i} - 1] = \mathtt{TIndex}[\mathtt{X}[\mathtt{i}], \mathtt{i}]
       return \mathtt{X}

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

Применение

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

См. также

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