Алгоритм Витерби — различия между версиями
Shersh (обсуждение | вклад) |
|||
Строка 1: | Строка 1: | ||
== История == | == История == | ||
Алгоритм Витерби был представлен в 1967 году для декодирования сверточных кодов, поступающих через зашумленный канал связи. В 1969 году Омура (Omura) показал, что основу алгоритма Витерби составляет оценка максимума правдоподобия. | Алгоритм Витерби был представлен в 1967 году для декодирования сверточных кодов, поступающих через зашумленный канал связи. В 1969 году Омура (Omura) показал, что основу алгоритма Витерби составляет оценка максимума правдоподобия. | ||
− | + | ||
− | |||
== Описание == | == Описание == | ||
Алгоритм Витерби позволяет сделать наилучшее предположение о последовательности состояний скрытой модели на основе последовательности наблюдений. Эта последовательность состояний называется путем Витерби. | Алгоритм Витерби позволяет сделать наилучшее предположение о последовательности состояний скрытой модели на основе последовательности наблюдений. Эта последовательность состояний называется путем Витерби. | ||
{{Определение | {{Определение | ||
|id=def1. | |id=def1. | ||
− | |definition=Путь Витерби | + | |definition='''Путь Витерби''' {{---}} наиболее правдоподобная последовательность скрытых состояний. |
}} | }} | ||
− | Пусть задано пространство наблюдений <tex>O =\{o_1,o_2...o_N\}</tex>, пространство состояний <tex>S =\{s_1,s_2...s_K\}</tex>, последовательность наблюдений <tex>Y =\{y_1,y_2...y_T\}</tex>, матрица <tex>A</tex> переходов из <tex>i</tex>-того состояния в <tex>j</tex>-ое, размером <tex>K | + | Пусть задано пространство наблюдений <tex>O =\{o_1,o_2...o_N\}</tex>, пространство состояний <tex>S =\{s_1,s_2...s_K\}</tex>, последовательность наблюдений <tex>Y =\{y_1,y_2...y_T\}</tex>, матрица <tex>A</tex> переходов из <tex>i</tex>-того состояния в <tex>j</tex>-ое, размером <tex>K \times K</tex>, матрица эмиссии <tex> B </tex> размера <tex>K \times N</tex>, которая определяет вероятность наблюдения <tex>o_j</tex> из состояния <tex>s_i</tex>, массив начальных вероятностей <tex>\pi</tex> размером <tex>K</tex>, показывающий вероятность того, что начальное состояние <tex>s_i</tex>. Путь <tex>X =\{x_1,x_2...x_T\}</tex> {{---}} последовательность состояний, которые привели к последовательности наблюдений <tex>Y</tex>. |
'''Скрытая марковская модель.''' | '''Скрытая марковская модель.''' | ||
Строка 19: | Строка 18: | ||
Рассмотрим пример скрытой марковской модели. У Деда Мороза есть три мешка с подарками в разноцветной упаковке: красной, синей, зеленой и фиолетовой. Ночью Дед Мороз пробирается в квартиру и тайком выкладывает подарки под елкой в ряд, доставая по одному подарку из мешка. Наутро мы обнаруживаем упорядоченную последовательность из пяти подарков и хотим сделать наилучшее предположение о последовательности мешков, из которых он доставал эти подарки. | Рассмотрим пример скрытой марковской модели. У Деда Мороза есть три мешка с подарками в разноцветной упаковке: красной, синей, зеленой и фиолетовой. Ночью Дед Мороз пробирается в квартиру и тайком выкладывает подарки под елкой в ряд, доставая по одному подарку из мешка. Наутро мы обнаруживаем упорядоченную последовательность из пяти подарков и хотим сделать наилучшее предположение о последовательности мешков, из которых он доставал эти подарки. | ||
− | Дед Мороз с мешками | + | Дед Мороз с мешками {{---}} скрытая марковская модель. При этом 4 цвета {{---}} пространство из <tex>N</tex> наблюдений, 3 мешка {{---}} количество состояний <tex>K</tex>, 5 подарков {{---}} наши <tex>T</tex> наблюдений, каждое из которых представлено цифрой {{---}} номером цвета {{---}} от 1 до 5. Мы знаем, каковы вероятности того, что Дед Мороз начнет доставать подарки из мешка с номером <tex>i</tex> {{---}} вектор <tex>\pi[i]</tex>. Мы также знаем матрицу переходов <tex>A</tex>, какова вероятность того, что от мешка с номером <tex>i</tex> Дед Мороз переходит к мешку с номером <tex>j</tex>. Мешки Деда Мороза бесконечны, но мы точно знаем, каково соотношение цветов подарков в кажом мешке ему загрузили на заводе в Великом Устюге. Это матрица вероятностей эмиссии <tex>B</tex>. |
== Алгоритм == | == Алгоритм == | ||
− | Создадим две матрицы <tex> | + | Создадим две матрицы <tex>TState</tex> и <tex>TIndex</tex> размером <tex>K \times T</tex>. Каждый элемент <tex>TState[i,j]</tex> содержит вероятность того, что на <tex>j</tex>-ом шаге мы находимся в состоянии <tex>s_i</tex>. Каждый элемент <tex>TIndex[i,j]</tex> содержит индекс наиболее вероятного состояния на <tex>{j-1}</tex>-ом шаге. |
− | '''Шаг 1.''' Заполним первый столбец матриц <tex> | + | '''Шаг 1.''' Заполним первый столбец матриц <tex>TState</tex> на основании начального распределения, и <tex>TIndex</tex> нулями. |
− | '''Шаг 2.''' Последовательно заполняем следующие столбцы матриц <tex> | + | '''Шаг 2.''' Последовательно заполняем следующие столбцы матриц <tex>TState</tex> и <tex>TIndex</tex>, используя матрицы вероятностей эмиссий и переходов. |
− | '''Шаг 3.''' Рассматривая максимальные значения в столбцах матрицы <tex> | + | '''Шаг 3.''' Рассматривая максимальные значения в столбцах матрицы <tex>TIndex</tex>, начиная с последнего столбца, выдаем ответ. |
== Псевдокод == | == Псевдокод == | ||
− | + | <code> | |
− | + | //функция возвращает вектор X {{---}} последовательность номеров наиболее вероятных состояний, которые привели к данным наблюдениям. | |
− | + | '''viterbi''' (O, S, <tex> \pi </tex>, Y, A, B) | |
− | + | '''for''' i = 1..K | |
− | + | TState[i, 1] = <tex> \pi </tex>[i] * B[i, Y[i]] | |
− | + | TIndex[i, 1] = 0 | |
− | + | '''for''' i = 2..T | |
− | + | '''for''' j = 1..K | |
− | + | 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]]) | |
− | + | //функция arg max() ищет максимум выражения в скобках и возвращает аргумент (в нашем случае <tex>k</tex>), при котором достигается этот максимум. | |
− | + | X[T] = <tex> \arg\max_{1 \leqslant k\leqslant K} \limits </tex>(TState[k, T]) | |
− | + | '''for''' i = T...2 | |
− | + | X[i - 1] = TIndex[X[i], i] | |
+ | '''return''' X | ||
+ | </code> | ||
+ | Таким образом, алгоритму требуется <tex> O(T\times\left|{S}\right|^2)</tex> времени. | ||
− | + | == Применение == | |
+ | Алгоритм используется в CDMA и GSM цифровой связи, в модемах и космических коммуникациях. Он нашел применение в распознавании речи и письма, компьютерной лингвистике и биоинформатике, а также в алгоритме свёрточного декодирования Витерби. | ||
== Ссылки == | == Ссылки == | ||
− | *[ | + | * [[wikipedia:Viterbi_algorithm|Wikipedia {{---}} Viterbi algorithm]] |
− | *[http://www.cs.sfu.ca/~oschulte/teaching/726/spring11/slides/mychapter13b.pdf Презентация] | + | * [http://www.cs.sfu.ca/~oschulte/teaching/726/spring11/slides/mychapter13b.pdf Презентация] |
− | [[Категория: Дискретная математика и алгоритмы]][[Категория: Марковские цепи]] | + | |
+ | [[Категория: Дискретная математика и алгоритмы]] | ||
+ | [[Категория: Марковские цепи]] | ||
+ | [[Категория: Динамическое программирование]] |
Версия 04:38, 14 января 2013
Содержание
История
Алгоритм Витерби был представлен в 1967 году для декодирования сверточных кодов, поступающих через зашумленный канал связи. В 1969 году Омура (Omura) показал, что основу алгоритма Витерби составляет оценка максимума правдоподобия.
Описание
Алгоритм Витерби позволяет сделать наилучшее предположение о последовательности состояний скрытой модели на основе последовательности наблюдений. Эта последовательность состояний называется путем Витерби.
Определение: |
Путь Витерби — наиболее правдоподобная последовательность скрытых состояний. |
Пусть задано пространство наблюдений , пространство состояний , последовательность наблюдений , матрица переходов из -того состояния в -ое, размером , матрица эмиссии размера , которая определяет вероятность наблюдения из состояния , массив начальных вероятностей размером , показывающий вероятность того, что начальное состояние . Путь — последовательность состояний, которые привели к последовательности наблюдений .
Скрытая марковская модель.
Модель представляет из себя марковскую цепь, для которой нам известны начальная вероятность и матрица вероятностей переходов. Скрытой она называется потому, что мы не имеем информации о ее текущем состоянии. Мы получаем информацию на основе некоторого наблюдения, в рассмотренном ниже алгоритме мы будем использовать просто натуральное число от 1 до
, как индекс наблюдаемого события. Для каждого состояния скрытой марковской модели задан вектор вероятности эмиссии, который характеризует вероятность наблюдени каждого события, когда модель находится в этом состоянии. Совокупность таких векторов образует матрицу эмиссии.Пример скрытой марковской модели.
Рассмотрим пример скрытой марковской модели. У Деда Мороза есть три мешка с подарками в разноцветной упаковке: красной, синей, зеленой и фиолетовой. Ночью Дед Мороз пробирается в квартиру и тайком выкладывает подарки под елкой в ряд, доставая по одному подарку из мешка. Наутро мы обнаруживаем упорядоченную последовательность из пяти подарков и хотим сделать наилучшее предположение о последовательности мешков, из которых он доставал эти подарки. Дед Мороз с мешками — скрытая марковская модель. При этом 4 цвета — пространство из
наблюдений, 3 мешка — количество состояний , 5 подарков — наши наблюдений, каждое из которых представлено цифрой — номером цвета — от 1 до 5. Мы знаем, каковы вероятности того, что Дед Мороз начнет доставать подарки из мешка с номером — вектор . Мы также знаем матрицу переходов , какова вероятность того, что от мешка с номером Дед Мороз переходит к мешку с номером . Мешки Деда Мороза бесконечны, но мы точно знаем, каково соотношение цветов подарков в кажом мешке ему загрузили на заводе в Великом Устюге. Это матрица вероятностей эмиссии .Алгоритм
Создадим две матрицы
и размером . Каждый элемент содержит вероятность того, что на -ом шаге мы находимся в состоянии . Каждый элемент содержит индекс наиболее вероятного состояния на -ом шаге.Шаг 1. Заполним первый столбец матриц
на основании начального распределения, и нулями.Шаг 2. Последовательно заполняем следующие столбцы матриц
и , используя матрицы вероятностей эмиссий и переходов.Шаг 3. Рассматривая максимальные значения в столбцах матрицы
, начиная с последнего столбца, выдаем ответ.Псевдокод
//функция возвращает вектор X — последовательность номеров наиболее вероятных состояний, которые привели к данным наблюдениям. viterbi (O, S,, Y, A, B) for i = 1..K TState[i, 1] = [i] * B[i, Y[i]] TIndex[i, 1] = 0 for i = 2..T for j = 1..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() ищет максимум выражения в скобках и возвращает аргумент (в нашем случае ), при котором достигается этот максимум. X[T] = (TState[k, T]) for i = T...2 X[i - 1] = TIndex[X[i], i] return X
Таким образом, алгоритму требуется
времени.Применение
Алгоритм используется в CDMA и GSM цифровой связи, в модемах и космических коммуникациях. Он нашел применение в распознавании речи и письма, компьютерной лингвистике и биоинформатике, а также в алгоритме свёрточного декодирования Витерби.