維特比演算法可以形式化的概括為:
對於每乙個i,i = 1,… ,n,令:xi
=(xi
1,xi
2,xi
3,xi
4...
,xit
)' role="presentation">xi=
(xi1
,xi2
,xi3
,xi4
...,
xit)
xi=(
xi1,
xi2,
xi3,
xi4.
..,x
it).
這一步是通過隱藏狀態的初始概率和相應的觀察概率之積計算了t=1時刻的區域性概率。
對於t=2,…,t和i=1,…,n,令: δt
(i)=
maxj
(δt−
1(j)
ajib
ikt)
' role="presentation">δt(
i)=m
axj(
δt−1
(j)a
jibi
kt)δ
t(i)
=max
j(δt
−1(j
)aji
bikt
)ϕt(
i)=a
rgma
xj(δ
t−1(
j)aj
i)' role="presentation">ϕt(
i)=a
rgma
xj(δ
t−1(
j)aj
i)ϕt
(i)=
argm
axj(
δt−1
(j)a
ji) 這樣就確定了到達下乙個狀態的最可能路徑,並對如何到達下乙個狀態做了記錄。具體來說首先通過考察所有的轉移概率與上一步獲得的最大的區域性概率之積,然後記錄下其中最大的乙個,同時也包含了上一步觸發此概率的狀態。 令:i
t=ar
gmax
(δt(
i))' role="presentation">it=
argm
ax(δ
t(i)
)it=
argm
ax(δ
t(i)
), 這就確定了系統完成時(t=t)最可能的隱藏狀態。
對於t=t-1,…,1,令it
=ϕt+
1(it
+1)' role="presentation">it=
ϕt+1
(it+
1)it
=ϕt+
1(it
+1),這樣就可以按最可能的狀態路徑在整個網格回溯。回溯完成時,對於觀察序列來說,序列i1
,i2,
i3..
.it' role="presentation">i1,
i2,i
3...
iti1
,i2,
i3..
.it就是生成此觀察序列的最可能的隱藏狀態序列。
下面這幅圖表顯示了
δ' role="presentation">δδ和
ϕ' role="presentation">ϕ
ϕ的計算細節, 在維特比演算法中我們選擇的是到達當前狀態的最可能路徑,而不是總的概率。我們在維特比演算法中維護了乙個「反向指標」記錄了到達當前狀態的最佳路徑,即在計算
ϕ' role="presentation">ϕ
ϕ時通過ar
gmax
' role="presentation">arg
maxa
rgma
x運算子獲得。
對於乙個特定的隱馬爾科夫模型,維特比演算法被用來尋找生成乙個觀察序列的最可能的隱藏狀態序列。我們利用概率的時間不變性,通過避免計算網格中每一條路徑的概率來降低問題的複雜度。維特比演算法對於每乙個狀態(t>1)都儲存了乙個反向指標(
ϕ' role="presentation">ϕ
ϕ),並在每乙個狀態中儲存了乙個區域性概率(
δ' role="presentation">δ
δ)。
區域性概率
δ' role="presentation">δ
δ是由反向指標指示的路徑到達某個狀態的概率。
當t=t時,維特比演算法所到達的這些終止狀態的區域性概率
δ' role="presentation">δ
δ是按照最優(最可能)的路徑到達該狀態的概率。因此,選擇其中最大的乙個,並回溯找出所隱藏的狀態路徑,就是這個問題的最好答案。
關於維特比演算法,需要著重強調的一點是它不是簡單的對於某個給定的時間點選擇最可能的隱藏狀態,而是基於全域性序列做決策——因此,如果在觀察序列中有乙個「非尋常」的事件發生,對於維特比演算法的結果也影響不大。
這在語音處理中是特別有價值的,譬如當某個單詞發音的乙個中間音素出現失真或丟失的情況時,該單詞也可以被識別出來。
程式來自 umdhmm c語言版本的hmm工具包中的維特比演算法程式。維特比演算法程式示例如下(在viterbi.c中):
void viterbi(hmm *phmm, int t, int *o, double **delta, int **psi,int *q, double *pprob)
/* 2. recursion */
for (t = 2; t <=
t; t++)
}delta[t][j] = maxval*(phmm->b[j][o[t]]);
psi[t][j] = maxvalind;
}} /* 3. termination */
*pprob = 0.0;
q[t] = 1;
for (i = 1; i <=
phmm->
n; i++)
}/* 4. path (state sequence) backtracking */
for (t = t - 1; t >= 1; t--)
q[t] = psi[t+1][q[t+1]];
}
在umdhmm包中所生成的4個可執行程式中,testvit是用來測試維特比演算法的, 對於給定的觀察符號串行及hmm,利用viterbi演算法生成最可能的隱藏狀態序列。這裡我們利用umdhmm包中test.hmm和test.seq來測試維特比演算法,關於這兩個檔案,具體如下:
test.hmm
m=2
n= 3
a:0.333 0.333 0.333
0.333 0.333 0.333
0.333 0.333 0.333
b:0.5 0.5
0.75 0.25
0.25 0.75
pi:0.333 0.333 0.333
test.seq
t=10
1 1 1 1 2 1 2 2 2 2
對於維特比演算法的測試程式testvit來說,執行:testvit test.hmm test.seq
結果如下:
viterbi using direct probabilities
viterbi mle log prob = -1.387295e+01
optimal state sequence:
t= 1022
2232
3333
//------------------------------------
viterbi using
log probabilities
viterbi mle log prob = -1.387295e+01
optimal state sequence:
t= 1022
2232
3333
//------------------------------------
the two
log probabilites and optimal state sequences
should identical (within numerical precision).
序列「2 2 2 2 3 2 3 3 3 3」就是最終所找到的隱藏狀態序列。好了,維特比演算法這一章就到此為止了。
譯自:
HMM(隱馬爾科夫模型)之 Viterbi 演算法
hmm 隱馬爾科夫模型 有 兩類變數 變數序列 1.hidden states xi 2.events ei 模型的三要素 三種求解問題 1.已知 模型三要素 和 events,求hidden states viterbi演算法 2.已知 模型三要素 和 events,求這一系列events發生的概...
機器學習 HMM 演算法
已知觀測序列o o1,ot 估計模型 a,b 的引數,使得在該模型下觀測序列概率 p o 極大似然估計的方法 樣本中時刻 t 處於狀態 i 時刻 t 1 轉移到狀態 j的頻數ai j,則轉移狀態概率矩陣ai j 的估計a ij a ij j 1na ij樣本中狀態為 j 並觀測為 k的頻數是bj k...
HMM演算法學習筆記
本文將講解hmm的各種演算法運用 背景 有 個色子abc,編號是1到m 此例中取3 每個色子可擲1到6,但分布律各不相等,現在我擲n次,每次隨機取乙個色子隨機擲得乙個點數並記為x i 但是我不知道每次擲的色子是哪個色子。概念引入 隱藏狀態數 m,現在是3種色子,所以隱藏狀態數是3種 輸出狀態數 s,...