Viterbi アルゴリズムは、HTMM において入力配列 s が与えられた時、s を生成する最適パス π* を推測するアルゴリズムである。
このことを数式で表すと、次のようになる。
\[ \pi ^{*} = argmax_{\pi} P(s,\pi | \theta) \]
すなわち、遷移確率が A および文字出力確率が E のとき(θ = (A, E))に、パス π を通り配列 s を出力する確率 P(s,π|θ) を最大にするパス π を、π* と表している。
確率 P を最大にするパス π を求めるために、まず、最大確率に関する漸化式をたてる。
開始状態 0 を出発して、i 番目の状態に達した時を考える。i 番目の状態を状態 k とし、生成された配列は s[1...i] とし、s[1...i] を生成する最大確率を vk(i) とおく。すると、vk(i) は次のように書き表せる。
\[ v_{k}(i) = max_{\pi}\left\{ a_{01} \prod^{i-1}_{j=1} e_{j}(s[j])a_{j(j+1)}\right\} \]
次に、i+1 番目の状態を考える。i+1 番目の状態を状態 l とおくと、上式と同様に、vl(i+1) は次のように表せる。
\[ v_{k}(i) = max_{\pi}\left\{ a_{01} \prod^{i}_{j=1} e_{j}(s[j])a_{j(j+1)}\right\} \]
ここで、両式を用いて漸化式を作る。
\[
\begin{eqnarray}
v_{l}(i+1) &=& max_{\pi}\left\{ a_{01} \prod^{i}_{j=1} e_{j}(s[j])a_{j(j+1)}\right\} \\
&=& max_{\pi}\left\{ e_{l}(s[i+1])a_{kl} \cdot a_{01} \prod^{i-1}_{j=1} e_{j}(s[j])a_{j(j+1)}\right\} \\
&=& max_{\pi}\left\{ e_{l}(s[i+1])a_{kl} \cdot v_{k}(i)\right\} \\
&=& e_{l}(s[i+1]) max_{\pi}\{a_{kl}v_{k}(i)\}
\end{eqnarray}
\]
このように最大確率 v(i) は漸化式で書き表すことができる。したがって、Viterbi のアルゴリズムはダイナミックプログラミングを利用して、計算することができる。HMM の状態数が m で、長さ n の配列 s を出力する確率が最大となるパスを、Viterbi アルゴリズムで求めると O(nm2) の時間を必要とする。