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