隱馬爾可夫(HMM)、前/后向算法、Viterbi算法


 

HMM的模型

       圖1

      如上圖所示,白色那一行描述由一個隱藏的馬爾科夫鏈生成不可觀測的狀態隨機序列,藍紫色那一行是各個狀態生成可觀測的隨機序列

      話說,上面也是個貝葉斯網絡,而貝葉斯網絡中有這么一種,如下圖:

          

      代表:c確定時a和b獨立。(c為實心圓代表:c已經被確定)

      這時,如果把z1看成a,x1看成b,z2看成c的話,則因為第一個圖的z1是不可觀測的(所以z1是空心圓),也就是沒確定,則x1和z2就一定有聯系。

      進一步,如果把z2、x2合在一起看成c的話,則x1和z2、x2就一定有聯系,則x1和x2有聯系(不獨立)。

      推廣之后:x2和x3不獨立,x1和x3也不獨立,於是xn們互相不獨立。

PS:

LDA假定文章中的詞與詞之間互相獨立,而HMM中是所有的觀測互相均不獨立。

所以,對於一篇Machine Learn的文章,LDA會吧“機器”和“學習”分成兩個詞,而HMM會將其視為一個詞。

 

HMM的確定

 

初始概率分布

      z1可能是狀態1,狀態2 ... 狀態n,於是z1就有個N點分布:

Z1

狀態1

狀態2

...

狀態n

概率

P1

P2

...

Pn

      即:Z1對應個n維的向量。

      上面這個n維的向量就是初始概率分布,記做π。

 

狀態轉移矩陣

      但Z2就不能簡單的“同上”完事了,因為Z2和Z1不獨立,所以Z2是狀態1的概率有:Z1是狀態1時Z2是狀態1,Z1是狀態2時Z2是狀態1,..., Z1是狀態n時Z2是狀態1,於是就是下面的表

Z2

Z1

狀態1

狀態2

...

狀態n

狀態1

P11

P12

...

P1n

狀態2

P21

P22

...

P2n

...

...

...

...

...

狀態n

Pn1

Pn2

...

Pnn

       即:Z1->Z2對應個n*n的矩陣。

       同理:Zi -> Zi+1對應個n*n的矩陣。

      上面這些n*n的矩陣被稱為狀態轉移矩陣用An*n表示。

      當然了,真要說的話,Zi -> Zi+1的狀態轉移矩陣一定都不一樣,但在實際應用中一般將這些狀態轉移矩陣定為同一個,即:只有一個狀態轉移矩陣。

      圖1的第一行就搞定了,下面是第二行。

 

觀測矩陣

      如果對於zi有:狀態1, 狀態2, ..., 狀態n,那zi的每一個狀態都會從下面的m個觀測中產生一個:觀測1, 觀測2, ..., 觀測m,所以有如下矩陣:

X

Z

觀測1

觀測2

...

觀測m

狀態1

P11

P12

...

P1m

狀態2

P21

P22

...

P2m

...

...

...

...

...

狀態n

Pn1

Pn2

...

Pnm

      這可以用一個n*m的矩陣表示,也就是觀測矩陣,記做Bn*m

 

      由於HMM用上面的π,A,B就可以描述了,於是我們就可以說:HMM由初始概率分布π、狀態轉移概率分布A以及觀測概率分布B確定,為了方便表達,把A, B, π 用 λ 表示,即:

            λ = (A, B, π)

例子

      假設我們相對如下這行話進行分詞:

           歡迎來到我的博客

      再假設我們是這樣分的:找到“終止字”,然后根據終止字來分詞。即:對於這行字,“迎、到、我、的、客”是終止字,於是最終這么分詞:歡迎/來到/我/的/博客

      下面用上面的知識對這個例子建立HMM的A, B, π:

       初始概率分布的確定:

           1,對於每個樣本,我們的目標是確定其是不是“終止字”,因此對於每個樣本,其狀態只有n=2個:狀態1 -- 是、狀態2 -- 不是。

            2,因此初始概率分布π為:

                 π = {p1,p2}

                 P1:整個句子中第一個字是非終止字的概率

                  P2:整個句子中第一個字是終止字的概率

      狀態轉移矩陣的確定:

           剛才已經知道狀態有n=2個,於是狀態轉移矩陣就立馬得出了,即狀態轉移矩陣是個n*n的矩陣,如下:

                 A=

                 p11:非終止字 -> 非終止字的概率。

                 p12:非終止字 -> 終止字的概率。

                 p21:終止字 -> 非終止字的概率。

                  p22:終止字 -> 終止字的概率。

       觀測矩陣的確定:

           如果我們的目標文字使用Unicode編碼,那么上面的任何一個字都是0~65535中的一個數,於是我們的觀測就會有m=65536個,於是觀測矩陣就是個n*m的矩陣,如下:

                 B=

                 p1,0:Unicode編碼中0對應的漢字是非終止字的概率

                 p1,65535:Unicode編碼中65535對應的漢字是非終止字的概率

                 p2,0:Unicode編碼中0對應的漢字是終止字的概率

                 p2,65535:Unicode編碼中65535對應的漢字是終止字的概率

            PS:為什么x會有65535個觀測啊?“歡迎來到我的博客”這個明明只有8個字。原因是因為真正的HMM面臨的情況,即:現有了 Z1=“非終止字”這個狀態,然后根據這個狀態從65535個字中選出x1=“歡”這個字,然后根據狀態轉移矩陣,下一次轉移到了Z2 =“終止字”,然后根據Z2從65535個字中選出了x2=“迎”這個字,這樣,最終生成了這句話。

 

HMM的兩個基本性質

 齊次假設

      當前狀態之和上一個狀態有關系,用公式表示的話就是:

           P(zt|zt-1,xt-1, zt-2, xt-2, ..., z1, x1)= P(zt | zt-1)

 觀測獨立性假設

      所有的觀測之間是互相獨立的,某個觀測之和生成它的狀態有關系,即:

           P(xt|zt,xt, zt-1, xt-1, zt-2, xt-2,..., z1, x1) = P(xt | zt)

 

PS:在一開始時說x1和z2、x2不獨立,怎么在這里又說x1和x2獨立呢?其實真嚴格追究的話x1和x2的確不互相獨立,因為x1是被z1生成的,x2是被z2生成的, 但z2的形成受z1影響,所以x1和x2一定也會有聯系,但是為了研究和應用的方便,就假設:生成x1的z1和生成x2的z2不獨立,但x1和x2獨立。

 

HMM的三個問題

      現在有幾個問題:

           1,知道HMM的參數 λ = (A, B, π) 和觀測序列O = {o1,o2, ..., oT} ,如何計算模型 λ 下觀測序列O出現的概率P(O | λ)。

           2,HMM的參數如何確定?

                 比如:對於剛才的中文分詞的小例子。

                      初始概率分布π好確定:是不是終結詞的概率各是0.5。

                      觀測矩陣B也好確定:1/65535嘛

                 但狀態轉移矩陣怎么確定?我怎么知道下個詞是終結詞的概率是多少?

 

           3,知道HMM的參數 λ = (A, B, π) 和觀測序列O = {o1,o2, ..., oT},如何計算給定觀測序列條件概率P(I|O,  λ )最大的狀態序列I,即:

                 對於中文分詞,我想到底如何分的詞。

      上面三個問題:

           第一個問題被稱為:概率計算問題。

                     解決辦法:前向-后向算法(一種動態規划算法)。

           第二個問題被稱為:學習問題。

                     解決辦法:如果狀態序列已知,那用最大似然估計就好了,但HMM的狀態序列未知,即含有隱變量,所以要使用Baum-welch算法(其實其本質就是EM算法)。

           第三個問題被稱為:預測問題/解碼問題。

                     解決辦法:Viterbi算法(一種動態規划算法)。

概率計算問題

      該問題有兩種解決辦法:

           1,直接/暴力算法。

           2,前向算法/后向算法。

      而上面兩個算法中的“暴力方法”是實際應用中絕不會被使用的。

      Q:那為什么還說這玩意!(踹)

      A:理解了直接/暴力算法可以幫助你推導Baum-welch算法。(回踹!)

 直接/暴力計算法

      問題:已知HMM的參數 λ,和觀測序列O = {o1, o2, ...,oT},求P(O|λ)

      思想核心:大力出奇跡。

      思路:

           1,列舉所有可能的長度為T的狀態序列I = {i1, i2, ..., iT};

           2,求各個狀態序列I與觀測序列 的聯合概率P(O,I|λ);

           3,所有可能的狀態序列求和∑_I P(O,I|λ)得到P(O|λ)。

      步驟:

           1,最終目標是求O和I同時出現的聯合概率,即:

                 P(O,I|λ)= P(O|I, λ)P(I|λ)

           那就需要求出P(O|I, λ) 和 P(I|λ)。

           2,求P(I|λ) ,即狀態序列I = {i1,i2, ..., iT} 的概率:

                 2.1,P(I|λ) = P(i1,i2, ..., iT |λ)

                      =P(i1 |λ)P(i2, i3, ..., iT |λ)

                      =P(i1 |λ)P(i2 | i1, λ)P(i3, i4, ..., iT |λ)

                      =......

                      =P(i1 |λ)P(i2 | i1, λ)P(i3 | i2, λ)...P(iT | iT-1, λ)

                 而上面的P(i1 |λ) 是初始為狀態i1的概率,P(i2 | i1, λ) 是從狀態i1轉移到i2的概率,其他同理,於是分別使用初始概率分布π 和狀態轉移矩陣A,就得到結果:

                

                 PS:上面的ai1i2代表A的第i1行第i2列。

 

           3,P(O|I, λ),即對固定的狀態序列I,觀測序列O的概率是:

                

           4,代入第一步求出P(O,I|λ)。

           5,對所有可能的狀態序列I求和得到觀測序列O的概率P(O|λ):

          

 

      時間復雜度:

           每個時刻有n個狀態,一共有t個時刻,而根據上面的第5步可以知道每個時刻需要乘2T-1次,所以時間復雜度是:O((2T-1)nT)

 前向算法/后向算法

前向概率-后向概率

      如下圖所示:

      第一行是觀測不到的狀態序列,第二行是可以觀測到的觀測序列。

      前向概率的定義是:當第t個時刻的狀態為i時,前面的時刻分別觀測到y1,y2, ..., yt的概率,即:

          

      后向概率的定義是:當第t個時刻的狀態為i時,后面的時刻分別觀測到yt+1,yt+2, ..., yT的概率,即:

          

前向算法

      如果令前向概率中的t=T,即:

           αi(T) = p(y1,y2, ..., yT, qT = i | λ)

      那這就意味着,最后一個時刻位於第i號狀態時,觀測到y1, y2, ..., yT的概率,這不就是“直接/暴力計算法”中第4步求出來的P(O,I|λ) 嘛。

      因此,如果對 αi(T) 的i求和,即:

           α1(T) +α2(T) + ...+ αn(T)  式1

      那就是觀測序列O的概率P(O|λ)。

      那么如何算α1(T) +α2(T) + ...+ αn(T)?

      這樣想:

           嗯..如果能算出第T-1時刻的前向概率,即α1(T-1) +α2(T-1) + ... + αn(T-1) 的話,那就能算出式1了(HMM的參數知道了,根據參數不就得了)。

           進一步,如果能算出T-2時刻的前向概率,那就能得出T-1時刻的,進而就得出時刻T的了。

           按照這個思路:啊!我只要算出1時刻的前向概率不就能算出結果了!

      剛才得到了有趣的結果,即:我求出第一個1時刻的前向概率 αi(1) 后就等於求出最終結果了,那 αi(1) 是啥?

      不就是第一個時刻狀態為第i號狀態時觀測到y1的概率嗎,即:

           αi(1) = P(y1,q1=i | λ)

      而第一個時刻狀態為第i號狀態的概率是πi,在第i號狀態時得到y1這個觀測的概率是Biy1,於是:

           αi(1) =πi* Biy1

      PS:因為不知道當前是幾號狀態,所以為了以后的步驟,這里需要將所有的狀態都算出來,即:計算出所有的 α1(1)  ~  αi(1)

      好了,第一個時刻已經求出來了,我們就向后推。

      假設現在到第t個時刻了,而第t個時刻的狀態是狀態j,那我想求時刻t+1狀態為i的前向概率怎么求,這樣求:

       時刻t+1的前向概率的 αi(t+1) 的求法就是:t時刻的狀態轉移到t+1時刻的狀態的概率對所有狀態求和 * t時刻的狀態得到觀測的概率,換句話說就是:t時刻的前向概率對所有的狀態求和 * t時刻的狀態得到觀測的概率。

      即:

           ai(t+1) = (∑_j aj(t)aji)biy(t+1)

      解釋一下:

           首先,時刻t時狀態為j的前向概率是aj(t)。

           現在時刻t狀態為j的概率知道了,那乘上狀態j轉移到狀態i的轉移概率就是時刻t+1時狀態為i的概率,即 aj(t)aji 。

           但狀態是不可觀測的啊,所有我們要計算時刻t時所有狀態的情況,於是要對j求和,即:∑_j aj(t) aji,這才是t時刻的狀態轉移到t+1時刻狀態的總概率。

           但這樣還沒完,因為還要由狀態得到觀測,所以還要在乘上狀態i得到觀測yt+1的概率,於是就是上面的式子了。

      現在ai(t+1) 知道怎么求了,那不就是所有的的前向概率都知道怎么求了,於是利用剛才的結論:P(O|λ) = α1(T) +α2(T) + ... + αn(T),不就求出觀測序列O的概率P(O|λ)了,即:

           P(O|λ) =∑_i αi(T)

      OK,前向算法說完了,下面總結下。

 

前向算法總結

       初值:αi(1) =πi* Biy1

       遞推:對於t = 1, 2, …,T-1

ai(t+1) = (∑_j aj(t)aji)biy(t+1)

       最終:P(O|λ) =∑_i αi(T)

       PS:這里的 αi(t) 中i表示第i號狀態,t表示第t時刻。有的教程中會把i和t位置調換一下,變成 αt(i),其實都一樣。

 

前向算法例子

      假設有3個盒子,編號為1,2,3,每個盒子都裝有紅白兩種顏色的小球,數目如下:

          

盒子號

1

2

3

紅球數

5

4

7

白球數

5

6

3

      然后按照下面的方法抽取小球,來得到球顏色的觀測序列:

           1,按照 π=(0.2, 0.4, 0.4) 的概率選擇1個盒子,從盒子隨機抽出

1個球,記錄顏色后放回盒子;

2,按照下圖A選擇新的盒子,按照下圖B抽取球,重復上述過程;

PS:

A的第i行是選擇到第i號盒子,第j列是轉移到j號盒子,如:第一行第二列的0.2代表:上一次選擇1號盒子后這次選擇2號盒子的概率是0.2。

B的第i行是選擇到第i號盒子,第j列是抽取到j號球,如:第二行第一列的0.4代表:選擇了2號盒子后抽取紅球的概率是0.4。

       求:得到觀測序列“紅白紅”的概率是多少?

       解:

1,明確已知:HMM模型的參數已經如上圖所示了,那我們就需要再明確兩件事:HMM中那“看不見的狀態”和“可見的觀測”分別是什么。

           “可見的觀測”根據題目可知是:y =“紅白紅”, “看不見的狀態”就是這三次分別選擇了什么盒子,且一共有3個狀態:選中1號盒子、選中2號盒子、選中3號盒子。

           2,根據前向算法,第一步計算 αi(1),這很簡單:

                 αi =1 (t=1) 即時刻1時位於狀態“選中1號盒子”的前向概率,所以:α1(1) =“選中1號盒子”*“選中紅球” = π0* B10= 0.2*0.5 = 0.1

                 同理:α2(1) =0.4*0.4 = 0.16,α3(1) = 0.4*0.7 = 0.28。

           3,計算 αi(2):

                 根據公式:

α1(2) = (∑_j α1(2)αj1) b1y2

= (0.1*0.5 + 0.16*0.3 + 0.28*0.2) * 0.5

=0.077

α2(2) = 0.1104

α3(2) = 0.0606

           4,同αi(2),計算αi(3):

                 α1(3) =0.04187

                 α2(3) =0.03551

                 α3(3) =0.05284

           5,最終

P(O|λ) = ∑_i αi(3)

= 0.04187 + 0.03551 + 0.05284

= 0.13022

后向算法

      有了前向算法的基礎,后向算法就好說了,因為就是前向算法的反過來:先計算最后一個然后推到第一個,於是詳細說明就不在給了,直接上結論:

     

后向算法總結

       初值:βT(i) = 1

      PS:概率為1的原因是 -- 本來還需要看看時刻T后面有什么東西,但因為最后一個時刻T 后面已經沒有時刻,即不需要再觀測某個東西,所以你隨便給個什么都行,我不在乎。

       遞推:對於t = T-1, T-2,…, 1

βi(t) = (∑_j aijbjy(t+1)βj(t+1))

       PS:這一步是根據t+1的后向概率算t時刻的后向概率βi(t),因此:

           βi(t) = 第t時刻位於第i號狀態轉移到第t+1時刻位於第j號狀態的概率aij *   第t+1時刻第j號狀態給出y(t+1) 觀測的概率bjy(t+1) * 第t+1時刻的后驗概率。

       最終:P(O|λ) =∑_i πibiy1βi(1)

      PS:同第二步,只不過這里是第1時刻。

 

前后向概率的關系

      具體推倒就不給出了,總之:

      擁有所有觀測時,第t時刻有第i個狀態的概率 = t時刻的前向概率 * t時刻的后向概率,即:

           P(it = qi, Y | λ )  = αi(t) * βi(t)

 

單個狀態的概率

      這里的單個狀態是什么呢?就是給定觀測O和HMM的參數 λ 時,在時刻t時位於隱狀態i的概率,記為:

           γt(i) = P(it= qi | O, λ)

      PS:這里的O是所有觀測的合集,即:O = {y1 = o1, y2 = o2, …,yT = oT}

       這個就很強啦,因為我們可以估計在t時刻的隱狀態,進而求出隱狀態序列!

      PS:這個的確是求隱狀態序列的一種方式,但這種有個問題 -- 求出的隱狀態之間互相獨立,即:沒有考慮到第t+1時刻的隱狀態是由第t時刻的隱狀態轉移過來的情況。換言之:這樣求得的隱狀態是“每個隱狀態都是僅在當前時刻最優,可每個隱狀態都沒考慮到全局情況”。

      而它的求解也很簡單,如下:

兩個狀態的聯合概率

      剛才“單個狀態的概率”求得的t時刻的隱狀態沒有考慮到“上下文”,那就考慮下上下文,即:時刻t位於隱狀態i時,t+1時刻位於隱狀態j,記為:

           ξt(i, j) =P(it = qi, it+1 = qj | O, λ)

      求解推導:

 

一些期望

          

學習問題

      學習問題分兩種:

1,        觀測序列和隱狀態序列都給出,求HMM。

PS:這種學習是監督學習。

2,        給出觀測序列,但沒給出隱狀態序列,求HMM。

PS:這種學習是非監督學習,利用Baum-Welch算法。

觀測序列和隱狀態序列都給出

      這種其實求法超簡單:用大數定理用頻率來估算HMM的三種概率就OK了。

          

       解釋:

           還是用最開始的分詞的例子。

              初始概率:

i = 0:第一個文字是終止字的次數 / (第一個文字是終止字的次數 + 不是終止字的次數)

i = 1:第一個文字不是終止字的次數 / (第一個文字是終止字的次數 + 不是終止字的次數)

              轉移概率:

                 i=0,j=0:第t個字是終止字,第t+1個字是終止字的次數 / (第t個字是終止字,第t+1個字是終止字的次數 + 第t個字是終止字,第t+1個字不是終止字的次數 + 第t個字不是終止字,第t+1個字是終止字的次數 + 第t個字不是終止字,第t+1個字不是終止字的次數)

                 i=0,j=1、i=1, j=0、i=1, j=1同理。

              觀測概率:

                 i=0,k=0:Unicode編碼中編碼為0的字是終止字的次數 / (Unicode編碼中編碼為0的字是終止字的次數 + Unicode編碼中編碼為0的字不是終止字的次數)

                 i=1,k=0:Unicode編碼中編碼為0的字不是終止字的次數 / (Unicode編碼中編碼為0的字是終止字的次數 + Unicode編碼中編碼為0的字不是終止字的次數)

                 其他k=j同理。

 

Baum-Welch算法

      其實該算法的本質就是EM算法,因為它解決的問題就是:有了觀測值X,而觀測值有個隱變量Z時,求在HMM參數 λ下的聯合概率P(X, Z | λ) 。

PS:我總結的EM算法地址如下:

http://blog.csdn.net/xueyingxue001/article/details/52020673

      這里在貼一下EM算法的步驟:

      上面的步驟寫成統一的式子就是:

因此EM算法對應到HMM的學習問題就是:

  所有觀測數據寫成O=(o1, o…oT),所有隱數據寫成I=(i1, i2 …iT),完全數據是(O, I)=(o1, o2 …oT  ,i1,i2 … iT),完全數據的對數似然函數是lnP(O, I | λ)

於是:

就有如下推導:

       解釋:

           第一行:EM的Q函數。

           第二行:條件概率公式。

           第三行:

第一:第二行分母代表“上一次求出的參數與觀測集合的聯合概率”,對本次的估計沒幫助,所以可以舍去。

第二:第三行那個是正比符號,即使沒有上一個解釋可是可以保證第二行與第三行是成正比的。

      話說,P(O, I | λ) 在“HMM概率計算問題”的“直接/暴力計算法”中已經解出了,這里再貼下截圖:

     

      於是上面可以進一步做如下推導:

     

      對於上式,除了HMM的參數 λ = (A, B, π) 外都是已知的了。

      話說上圖將最后一個等號寫在3行是為了表述一點:這三行的每一行僅包含HMM的一個參數,而我們的目標是求Q函數的最大,於是只要求最后三行的最大就好了。為了方便說明,我將上圖最后三行的三個式子從上向下依次命名為:π式,α式,β式。

求 π 式

      π 式有個約束:所有πi的和為1。

      於是對於有約束的求極值為題就拉格朗日乘子法的伺候!

      1,拉格朗日函數

     

      2,上式對 πi 求偏導

     

      3,上式對i求和后 πi 的和為1就把 π 約掉了,從而求出拉格朗日參數

     

      4,將上式帶入第二步的式子就求出了π:

     

      而上式的 γ 就是“HMM概率計算問題”中“單個狀態的概率”中的 γ(PS:不是拉格朗日參數),於是 π 就求出來了!

 

求 α 式

      α 式可以寫成

      仍然使用拉格朗日乘子法,得到

     

     

      上式的 γ 是“HMM概率計算問題”中“單個狀態的概率”中的 γ,上式的 ξ 是“HMM概率計算問題”中“兩個狀態的聯合概率”中的 ξ。

 

求 β 式

      同理,得到:

     

      上式的 γ 是“HMM概率計算問題”中“單個狀態的概率”中的 γ。

 

預測問題

      預測問題有兩種解決辦法:

1,        近似算法。其實就是“HMM概率計算問題”中“單個狀態的概率”的解法。

2,        Viterbi 算法。下面講解這個。

VIterbi算法

      在介紹維特比算法之前,我先用通俗的語言描述下它。

      假設我們遇到了這么個問題:

           大學時你讓室友幫你帶飯(如果你上過大學,別告訴我你沒干過這事....),然后你室友問你想吃啥?你回答:“你吃啥我吃啥,不過回來時幫忙帶瓶雪碧,謝啦”。於是有趣的事就發生了:你室友給你帶回了飯和雪碧並興高采烈的說:“我去,食堂換大廚了,那個小賣部的收銀員換成了個漂亮妹子!!”然后你問他:“你去的哪個食堂和小賣部?”,他想了想回答:“你猜。”

           好了,你猜吧~

           我猜你妹啊(╯‵□′)╯︵┻━┻

      嘛,先別慌掀桌,不管如何你室友幫你帶了飯,所以咱們就滿足下他那小小的惡作劇,就當做是給他跑腿的辛苦費好了。

      PS:假設你學校有2個小賣部和2個食堂。

      於是,mission start!

      首先,問他:你先去得小賣部?他回答:是的。

      OK,買東西的先后順序搞定了,如下圖:

     

      接下來開始思考:

           第一步:從宿舍到小賣部A和B的距離都差不多,不好判斷,即從宿舍到小賣部A的概率 = 從宿舍到小賣部B的概率,如下圖;

          

           第二步:從小賣部A、B到食堂1、2有四種路線(A1, A2, B1, B2),然后這四種路線中到食堂1最短的是A1,到食堂2最短的是B2,然后這貨絕對那個近選哪個,所以如果去食堂1,則他會選擇A1,如果去食堂2,則他會選擇B2,如下圖:

          

           第三步:看看他給帶來的飯,嗯....這個飯我記得食堂1有賣,食堂2不知道,就當沒有吧,那就假設他去的是食堂1,如下圖:

          

           第四步:OK,終點已經確定,接下來反推回去,就好了,即:他絕壁選個最近的小賣部,所以他會選擇距離食堂1最近的小賣部A,如下圖:

          

           第五步:對他說:“你先去小賣部A然后去食堂1對吧”,他說:“我次奧,你咋知道的”。

 

      OK,例子舉完了,我們來看看維特比算法,其實維特比算法就是上面的過程:         1,先從前向后推出一步步路徑的最大可能,最終會得到一個從起點連接每一個終點的m條路徑(假設有m個終點)。

            2,確定終點之后在反過來選擇前面的路徑。

            3,確定最優路徑。

      下面看看Viterbi算法的定義。

Viterbi 算法的定義

      定義變量δt(i):表示時刻t狀態為i的所有路徑中的概率最大值,公式如下:

          

      過程:

          

      上面的符號之前都已經見過,這里不再解釋,下面為了更好地理解這幾步,我們來舉個例子。

例子

      還是盒子球模型。

      盒子和球模型λ= (A, B,π),狀態集合Q={1, 2, 3},觀測集合V={紅, 白},

          

      已知觀測序列O=(紅,白,紅),試求最優狀態序列,即最優路徑I*= (i1*, i2*, i3*)。

      解:

           如下圖所示(圖中的數字在之后的步驟中會一一推導出來)

                

           要在所有可能的路徑中選擇一條最優路徑,按照以下步驟出來。

              1,初始化

              t=1時,對每個狀態i, i=1, 2, 3,求狀態為i觀測o1為紅的概率,記此概率為δ1(i),則:

                 δ1(i) = πibi(o1)=πibi(紅), i = 1, 2, 3

           代入實際數據

                 δ1(1) = 0.10,δ1(2) =0.16,δ1(3) = 0.28

           記ψ1(i) = 0,i = 1, 2, 3。

           2,在t=n時

           t=2時,對每個狀態i,求在t=1時狀態為j觀測為紅並且在t=2時狀態為i觀測為白的路徑的最大概率,記概率為δ2(t),則根據:

                

           同時,對每個狀態i, i = 1, 2, 3,記錄概率最大路徑的前一個狀態j:

                

           計算:

                

           同樣,在t=3時

                                

           3,求最優路徑的終點

              以P*表示最優路徑的概率,則

                

           最優路徑的終點是i3*:

                

           4,逆向找i2*,i1*

                 在t=2時,i2* = ψ3(i3*) =ψ3(3) = 3

                 在t=2時,i1* = ψ2(i2*) =ψ2(3) = 3

           於是求得最優路徑,即最有狀態序列I* = (i1*,i2*, i3*) = (3, 3, 3)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM