A Viterbi algoritmus az állapotok legmegfelelőbb listájának megtalálására szolgáló algoritmus (úgynevezett Viterbi-útvonal ), amely a Markov-láncok kontextusában megkapja a bekövetkezett események legvalószínűbb sorozatát.
Ez egy dinamikus programozási algoritmus . A Viterbi konvolúciós dekódoló algoritmusban használatos .
Az algoritmust Andrew Viterbi javasolta 1967-ben, mint egy hálózatokon zajos konvolúciós kód dekódolására szolgáló algoritmust . [1] Az algoritmust széles körben használták GSM és CDMA mobiltelefonok, betárcsázós modemek és 802.11 vezeték nélküli hálózatok konvolúciós kódjainak dekódolására . Széles körben használják a beszédfelismerésben , beszédszintézisben , a számítógépes nyelvészetben és a bioinformatikában is . Például a beszédfelismerésben a hangjelzést események sorozataként érzékelik, és egy szövegsor az akusztikus jel "rejtett jelentése". A Viterbi algoritmus megkeresi az adott jel legvalószínűbb szövegsorát.
Az algoritmus több feltételezést is megfogalmaz:
Legyen egy rejtett Markov-modell (HMM) állapottérrel , ahol a lehetséges különböző hálózati állapotok száma. Ugyanakkor a hálózat által elfogadott állapotok láthatatlanok a megfigyelés számára. Jelölje a hálózat pillanatnyi állapotával . A hálózat kimenetén pillanatnyilag a megfigyelésre látható érték jelenik meg , ahol a kimeneten a lehetséges különböző megfigyelt értékek száma. Legyen a kezdeti valószínűsége annak, hogy a hálózat állapotba kerül , és legyen a hálózat állapotból állapotba való átmenetének valószínűsége .
Figyeljük meg a sorozatot a hálózat kimenetén . Ezután a következő rekurzív relációk segítségével meghatározható a megfigyelt sorozat hálózati állapotainak legvalószínűbb sorozata : [2]
Itt az első megfigyelt értékeknek megfelelő állapotok legvalószínűbb sorozatának valószínűsége , amely állapotra végződik . A Viterbi útvonalat mutatók segítségével találhatjuk meg, hogy megjegyezzük, melyik állapot jelent meg a második egyenletben. Legyen egy függvény, amely az if , vagy if kiszámításához használt értéket adja vissza . Akkor
Itt az arg max szabvány definícióját használjuk .
Ennek az algoritmusnak a bonyolultsága .