Алгоритм Витерби — различия между версиями
| Tindarid (обсуждение | вклад) | Tindarid (обсуждение | вклад)  | ||
| Строка 21: | Строка 21: | ||
| == Псевдокод == | == Псевдокод == | ||
| − | < | + | Функция возвращает вектор <tex>{X}</tex> : последовательность номеров наиболее вероятных состояний, которые привели к данным наблюдениям.   | 
| − | + |     '''viterbi'''(O, S, <tex> \pi </tex>, Y, A, B) | |
| − | + |         '''for''' i = 1 '''to''' K | |
| − | + |             TState[i, 1] = <tex> \pi </tex>[i] * B[i, Y[1]] | |
| − | + |             TIndex[i, 1] = 0 | |
| − | + |         '''for''' i = 2 '''to''' T | |
| − | + |            '''for''' j = 1 '''to''' K | |
| − |            '''for''' j = 1 | ||
|                TState[j, i] = <tex> \max_{1 \leqslant k\leqslant K} \limits </tex>(TState[k, i - 1] * A[k, j] * B[j, Y[i]])   |                TState[j, i] = <tex> \max_{1 \leqslant k\leqslant K} \limits </tex>(TState[k, i - 1] * A[k, j] * B[j, Y[i]])   | ||
|                TIndex[j, i] = <tex> \arg\max_{1 \leqslant k\leqslant K} \limits </tex>(TState[k, i - 1] * A[k, j] * B[j, Y[i]])   |                TIndex[j, i] = <tex> \arg\max_{1 \leqslant k\leqslant K} \limits </tex>(TState[k, i - 1] * A[k, j] * B[j, Y[i]])   | ||
| − |                //функция arg max() ищет максимум выражения в скобках и возвращает аргумент (в нашем случае  | + |                ''<font color=green>//функция arg max() ищет максимум выражения в скобках и возвращает аргумент (в нашем случае k), при котором достигается этот максимум</font>'' | 
| − | + |         X[T] = <tex> \arg\max_{1 \leqslant k\leqslant K} \limits </tex>(TState[k, T])   | |
| − | + |         '''for''' i = T '''downto''' 2 | |
| − | + |             X[i - 1] = TIndex[X[i], i] | |
| − | + |         '''return''' X | |
| − | |||
| Таким образом, алгоритму требуется <tex> O(T\times\left|{K}\right|^2)</tex> времени. | Таким образом, алгоритму требуется <tex> O(T\times\left|{K}\right|^2)</tex> времени. | ||
Версия 18:43, 30 марта 2018
История
Алгоритм Витерби (англ. Viterbi algorithm) был представлен в 1967 году для декодирования сверточных кодов, поступающих через зашумленный канал связи. В 1969 году Омура (Omura) показал, что основу алгоритма Витерби составляет оценка максимума правдоподобия.
Описание
Алгоритм Витерби позволяет сделать наилучшее предположение о последовательности состояний скрытой Марковской модели на основе последовательности наблюдений. Эта последовательность состояний называется путем Витерби (англ. Viterbi path).
| Определение: | 
| Путь Витерби — наиболее правдоподобная последовательность скрытых состояний. | 
Пусть задано пространство наблюдений , пространство состояний , последовательность наблюдений , матрица  переходов из -того состояния в -ое, размером , матрица эмиссии  размера , которая определяет вероятность наблюдения  из состояния , массив начальных вероятностей  размером , показывающий вероятность того, что начальное состояние . Путь  — последовательность состояний, которые привели к последовательности наблюдений .
Алгоритм
Создадим две матрицы и размером . Каждый элемент содержит вероятность того, что на -ом шаге мы находимся в состоянии . Каждый элемент содержит индекс наиболее вероятного состояния на -ом шаге.
Шаг 1. Заполним первый столбец матриц на основании начального распределения, и нулями.
Шаг 2. Последовательно заполняем следующие столбцы матриц и , используя матрицы вероятностей эмиссий и переходов.
Шаг 3. Рассматривая максимальные значения в столбцах матрицы , начиная с последнего столбца, выдаем ответ.
Псевдокод
Функция возвращает вектор : последовательность номеров наиболее вероятных состояний, которые привели к данным наблюдениям.
viterbi(O, S, , Y, A, B) for i = 1 to K TState[i, 1] = [i] * B[i, Y[1]] TIndex[i, 1] = 0 for i = 2 to T for j = 1 to K TState[j, i] = (TState[k, i - 1] * A[k, j] * B[j, Y[i]]) TIndex[j, i] = (TState[k, i - 1] * A[k, j] * B[j, Y[i]]) //функция arg max() ищет максимум выражения в скобках и возвращает аргумент (в нашем случае k), при котором достигается этот максимум X[T] = (TState[k, T]) for i = T downto 2 X[i - 1] = TIndex[X[i], i] return X
Таким образом, алгоритму требуется времени.
Применение
Алгоритм используется в CDMA и GSM цифровой связи, в модемах и космических коммуникациях. Он нашел применение в распознавании речи и письма, компьютерной лингвистике и биоинформатике, а также в алгоритме свёрточного декодирования Витерби.
