Алгоритм Витерби — различия между версиями
Tindarid (обсуждение | вклад) (→История) |
Tindarid (обсуждение | вклад) (→Алгоритм) |
||
Строка 23: | Строка 23: | ||
'''Входные данные:''' | '''Входные данные:''' | ||
− | #Пространство наблюдений <tex>\mathtt{O =\{o_1,o_2 \ldots o_N\ | + | #Пространство наблюдений <tex>\mathtt{O} =\{\mathtt{o_1},\mathtt{o_2} \ldots \mathtt{o_N}\}</tex> |
− | #Пространство состояний <tex>\mathtt{S =\{s_1,s_2 \ldots s_K\ | + | #Пространство состояний <tex>\mathtt{S} =\{\mathtt{s_1},\mathtt{s_2} \ldots \mathtt{s_K}}\}</tex> |
− | #Последовательность наблюдений <tex>\mathtt{Y =\{y_1,y_2 \ldots y_T\ | + | #Последовательность наблюдений <tex>\mathtt{Y} =\{\mathtt{y_1},\mathtt{y_2} \ldots \mathtt{y_T}}\}</tex> |
− | #Матрица <tex>\mathtt{A}</tex> переходов из <tex>\mathtt{i}</tex>-того состояния в <tex>\mathtt{j}</tex>-ое, размером <tex>\mathtt{K \times K}</tex> | + | #Матрица <tex>\mathtt{A}</tex> переходов из <tex>\mathtt{i}</tex>-того состояния в <tex>\mathtt{j}</tex>-ое, размером <tex>\mathtt{K} \times \mathtt{K}</tex> |
− | #Матрица эмиссии <tex>\mathtt{B}</tex> размера <tex>\mathtt{K \times N}</tex>, которая определяет вероятность наблюдения <tex>\mathtt{o_j}</tex> из состояния <tex>\mathtt{s_i}</tex> | + | #Матрица эмиссии <tex>\mathtt{B}</tex> размера <tex>\mathtt{K} \times \mathtt{N}</tex>, которая определяет вероятность наблюдения <tex>\mathtt{o_j}</tex> из состояния <tex>\mathtt{s_i}</tex> |
#Массив начальных вероятностей <tex>\mathtt{\pi}</tex> размером <tex>\mathtt{K}</tex>, показывающий вероятность того, что начальное состояние <tex>\mathtt{s_i}</tex> | #Массив начальных вероятностей <tex>\mathtt{\pi}</tex> размером <tex>\mathtt{K}</tex>, показывающий вероятность того, что начальное состояние <tex>\mathtt{s_i}</tex> | ||
'''Выходные данные''': | '''Выходные данные''': | ||
− | <tex>\mathtt{X =\{x_1,x_2 \ldots x_T\ | + | <tex>\mathtt{X} =\{\mathtt{x_1},\mathtt{x_2} \ldots \mathtt{x_T}\}</tex> {{---}} последовательность состояний, которые привели к последовательности наблюдений <tex>\mathtt{Y}</tex>. |
'''Алгоритм:''' | '''Алгоритм:''' | ||
− | Создадим две матрицы <tex>\mathtt{TState}</tex> и <tex>\mathtt{TIndex}</tex> размером <tex>\mathtt{K \times T}</tex>. Каждый элемент <tex>\mathtt{TState}[\mathtt{i,j}]</tex> содержит вероятность того, что на <tex>\mathtt{j}</tex>-ом шаге мы находимся в состоянии <tex>\mathtt{s_i}</tex>. Каждый элемент <tex>\mathtt{TIndex}[\mathtt{i,j}]</tex> содержит индекс наиболее вероятного состояния на <tex>{\mathtt{j-1}}</tex>-ом шаге. | + | Создадим две матрицы <tex>\mathtt{TState}</tex> и <tex>\mathtt{TIndex}</tex> размером <tex>\mathtt{K} \times \mathtt{T}</tex>. Каждый элемент <tex>\mathtt{TState}[\mathtt{i},\mathtt{j}]</tex> содержит вероятность того, что на <tex>\mathtt{j}</tex>-ом шаге мы находимся в состоянии <tex>\mathtt{s_i}</tex>. Каждый элемент <tex>\mathtt{TIndex}[\mathtt{i},\mathtt{j}]</tex> содержит индекс наиболее вероятного состояния на <tex>{\mathtt{j-1}}</tex>-ом шаге. |
'''Шаг 1.''' Заполним первый столбец матриц <tex>\mathtt{TState}</tex> на основании начального распределения, и <tex>\mathtt{TIndex}</tex> нулями. | '''Шаг 1.''' Заполним первый столбец матриц <tex>\mathtt{TState}</tex> на основании начального распределения, и <tex>\mathtt{TIndex}</tex> нулями. |
Версия 23:32, 17 мая 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
Таким образом, алгоритму требуется
времени.Применение
Алгоритм используется в
и цифровой связи, в модемах и космических коммуникациях. Он нашел применение в распознавании речи и письма, компьютерной лингвистике и биоинформатике, а также в алгоритме свёрточного декодирования Витерби.