Viterbi-algoritmen är en algoritm för att hitta den mest lämpliga listan över tillstånd (kallad Viterbi-banan ), som, i samband med Markov-kedjor, erhåller den mest sannolika sekvensen av händelser som har inträffat.
Det är en dynamisk programmeringsalgoritm . Den används i Viterbi faltningsavkodningsalgoritmen .
Algoritmen föreslogs av Andrew Viterbi 1967 som en algoritm för att avkoda en faltningskod som sänds över nätverk med brus. [1] Algoritmen har använts i stor utsträckning vid avkodning av faltningskoder för GSM- och CDMA -mobiltelefoner, uppringda modem och trådlösa 802.11 -nätverk . Det används också i stor utsträckning inom taligenkänning , talsyntes , datorlingvistik och bioinformatik . Till exempel, vid taligenkänning, uppfattas en ljudsignal som ett händelseförlopp och en textrad är den akustiska signalens "dolda betydelse". Viterbi-algoritmen hittar den mest sannolika textraden för en given signal.
Algoritmen gör flera antaganden:
Låt det finnas en dold Markov-modell (HMM) med tillståndsutrymme , där är antalet möjliga olika nätverkstillstånd. Samtidigt är de tillstånd som nätverket accepterar osynliga för observation. Ange med nätverkets status för tillfället . Vid utgången av nätverket visas det värde som är synligt för observation för tillfället , där är antalet möjliga olika observerade värden vid utgången. Låt vara den initiala sannolikheten för att nätverket är i tillståndet , och låt vara sannolikheten för nätverksövergången från stat till stat .
Låt sekvensen observeras vid utgången av nätverket . Sedan kan den mest sannolika sekvensen av nätverkstillstånd för den observerade sekvensen bestämmas med hjälp av följande rekursiva relationer: [2]
Här är sannolikheten för den mest sannolika sekvensen av tillstånd som motsvarar de första observerade värdena, som slutar på tillståndet . Viterbi-banan kan hittas genom att använda pekare för att komma ihåg vilket tillstånd som dök upp i den andra ekvationen. Låta vara en funktion som returnerar värdet som används för att beräkna if , eller if . Sedan
Här använder vi standarddefinitionen av arg max .
Komplexiteten i denna algoritm är .