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