Algoritmul Viterbi este un algoritm pentru găsirea celei mai potrivite liste de stări (numită calea Viterbi ), care, în contextul lanțurilor Markov, obține cea mai probabilă succesiune de evenimente care au avut loc.
Este un algoritm de programare dinamică . Este folosit în algoritmul de decodare convoluțional Viterbi .
Algoritmul a fost propus de Andrew Viterbi în 1967 ca algoritm pentru decodarea unui cod convoluțional transmis prin rețele cu zgomot. [1] Algoritmul a fost utilizat pe scară largă în decodarea codurilor convoluționale ale telefoanelor mobile GSM și CDMA , modemurilor dial-up și rețelelor fără fir 802.11 . De asemenea, este utilizat pe scară largă în recunoașterea vorbirii , sinteza vorbirii , lingvistică computațională și bioinformatică . De exemplu, în recunoașterea vorbirii, un semnal sonor este perceput ca o succesiune de evenimente, iar o linie de text este „sensul ascuns” al semnalului acustic. Algoritmul Viterbi găsește cea mai probabilă linie de text pentru un semnal dat.
Algoritmul face mai multe ipoteze:
Să existe un model Markov ascuns (HMM) cu spațiu de stare , unde este numărul de stări diferite posibile ale rețelei. În același timp, stările pe care le acceptă rețeaua sunt invizibile pentru observație. Indicați prin starea rețelei în acest moment . La ieșirea rețelei , valoarea vizibilă pentru observare apare în momentul de față , unde este numărul de valori diferite observate posibile la ieșire. Fie probabilitatea inițială ca rețeaua să fie în stare și fie probabilitățile tranziției rețelei de la stare la stare .
Să fie observată secvența la ieșirea rețelei . Apoi, cea mai probabilă secvență de stări de rețea pentru secvența observată poate fi determinată folosind următoarele relații recursive: [2]
Aici , este probabilitatea secvenței celei mai probabile de stări corespunzătoare primelor valori observate, care se termină în starea . Calea Viterbi poate fi găsită folosind pointeri pentru a reține care stare a apărut în a doua ecuație. Fie o funcție care returnează valoarea folosită pentru a calcula dacă , sau dacă . Apoi
Aici folosim definiția standard a arg max .
Complexitatea acestui algoritm este .