Алгоритм Витерби

Материал из testwiki
Перейти к навигации Перейти к поиску

Алгоритм Витерби — алгоритм поиска наиболее подходящего списка состояний (называемого путём Витерби), который в контексте цепей Маркова получает наиболее вероятную последовательность произошедших событий.

Является алгоритмом динамического программирования. Применяется в алгоритме свёрточного декодирования Витерби.

Алгоритм был предложен Эндрю Витерби в 1967 году как алгоритм декодирования свёрточного кода, передаваемого по сетям с наличием шума.[1] Алгоритм получил широкое применение в декодировании свёрточных кодов мобильных телефонов стандартов GSM и CDMA, dial-up модемах и беспроводных сетях стандарта 802.11. Также он широко используется в распознавании речи, синтезе речи, компьютерной лингвистике и биоинформатике. К примеру, при распознавании речи звуковой сигнал воспринимается как последовательность событий и строка текста есть «скрытый смысл» акустического сигнала. Алгоритм Витерби находит наиболее вероятную строку текста по данному сигналу.

Алгоритм делает несколько предположений:

  • наблюдаемые и скрытые события должны быть последовательностью. Последовательность чаще всего упорядочена по времени.
  • две последовательности должны быть выровнены: каждое наблюдаемое событие должно соответствовать ровно одному скрытому событию
  • вычисление наиболее вероятной скрытой последовательности до момента t должно зависеть только от наблюдаемого события в момент времени t, и наиболее вероятной последовательности до момента t − 1.

Алгоритм

Пусть существует скрытая марковская модель (СММ) с пространством состояний S={s1,s2,,sK}, где K — количество возможных различных состояний сети. При этом состояния, которые принимает сеть, невидимы для наблюдения. Обозначим через xt состояние сети в момент t. На выходе сети в момент t появляется видимое для наблюдения значение ytO={o1,o2,,oN}, где N — число возможных различных наблюдаемых значений на выходе. Пусть πi — начальная вероятность нахождения сети в состоянии i, а ai,j — вероятности перехода сети из состояния i в состояние j.

Пусть на выходе сети наблюдается последовательность y1,,yT. Тогда наиболее вероятная последовательность состояний сети x1,,xT для наблюдаемой последовательности может быть определена с помощью следующих рекуррентных соотношений:[2]

V1,k=P(y1 | k)πkVt,k=maxxS(P(yt | k)ax,kVt1,x)

Здесь Vt,k — это вероятность наиболее вероятной последовательности состояний, соответствующей первым t наблюдаемым значениям, завершающейся в состоянии k. Путь Витерби может быть найден при помощи указателей, запоминающих, какое состояние x появлялось во втором уравнении. Пусть Ptr(k,t) — функция, которая возвращает значение x, использованное для подсчета Vt,k, если t>1, или k если t=1. Тогда

xT=argmax\limits xS(VT,x)xt1=Ptr(xt,t)

Здесь мы используем стандартное определение arg max.
Сложность этого алгоритма равна O(T×|S|2).

См. также

Примечания

Шаблон:Примечания