hmm和Veterbi演算法(一)

來源:互聯網
上載者:User

標籤:百度搜   www.   產生   viterbi   網路   cell   hang   箭頭   最小值   

只是略微的看了些,有點感覺,還未深入,做個記錄。

參考: 隱馬爾可夫 (HMM)、前 / 後向演算法、Viterbi 演算法 再次總結

   誰能通俗的講解下 viterbi 演算法?

   數學之美第二版的第 26 章

本文結構:

  1.hmm三要素

  2.維特比演算法

  3.簡明例子

hmm三要素:

1.初始機率分布 π

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

Z1

狀態 1

狀態 2

...

狀態 n

機率

P1

P2

...

Pn

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

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

2.狀態轉移矩陣 A

      但 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 的狀態轉移矩陣一定都不一樣,但在實際應用中一般將這些狀態轉移矩陣定為同一個,即:只有一個狀態轉移矩陣。

3.觀測矩陣 B

      如果對於 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, π)

 

維特比演算法

維特比演算法是一個特殊但應用最廣的動態規划算法,它是針對籬笆網路的有向圖(Lattice)的最短路徑問題而提出的。凡是使用隱含馬爾可夫模型描述的問題都可以用維特比演算法來解碼,包括今天的數字通訊、語音辨識、機器翻譯、拼音轉漢字、分詞等。

1.基礎概括


(1)如果機率最大的路徑 P(或叫最短路徑)經過某個點,比如中的 X22,那麼這條路徑上從起始點 S 到 X22 的這一段子路徑 Q,一定是 S 到 X22 之間的最短路徑。否則,用 S 到 X22 的最短路徑 R 替代 Q,便構成了一條比 P 更短的路徑,這顯然是矛盾的。

(2)從 S 到 E 的路徑必定經過第 i 時刻的某個狀態,假定第 i 時刻有 k 個狀態,那麼如果記錄了從 S 到第 i 個狀態的所有 k 個節點的最短路徑,最終的最短路徑必經過其中的一條。這樣,在任何時刻,只需要考慮非常有限條最短路徑即可。

 (3)結合上述兩點,假定當我們從狀態 i 進入狀態 i+1 時,從 S 到狀態 i 上各個節點的最短路徑已經找到,並且記錄在這些節點上,那麼在計算從起點 S 到前一個狀態 i 所有的 k 個結點的最短路徑,以及從這 k 個節點到 Xi+1,j 的距離即可。

2.總結

(1)從點 S 出發,對於第一個狀態 X1 的各個節點,不妨假定有 n1 個,計算出 S 到它們的距離 d(S,X1i),其中 X1i 代表任意狀態 1 的節點。因為只有一步,所以這些距離都是 S 到它們各自的最短距離。

(2)對於第二個狀態 X2 的所有節點,要計算出從 S 到它們的最短距離。對於特點的節點 X2i,從 S 到它的路徑可以經過狀態 1 的 n1 中任何一個節點 X1i,對應的路徑長度就是 d(S,X2i) = d(S,X1i) + d(X1i,X2i)。由於 j 有 n1 種可能性,我們要一一計算,找出最小值。即:

d(S,X2i) = minI=1,n1 d(S,X1i) + d(X1i,X2i)

這樣對於第二個狀態的每個節點,需要 n1 次乘法計算。假定這個狀態有 n2 個節

點,把 S 這些節點的距離都算一遍,就有 O(n1·n2) 次計算。

(3)接下來,類似地按照上述方法從第二個狀態走到第三個狀態,一直走到最後一個狀態,就得到了整個網格從頭到尾的最短路徑。每一步計算的複雜度都和相鄰兩個狀態 Si 和 Si+1 各自的節點數目 ni,ni+1 的乘積成正比,即 O(ni·ni+1)

(4)假設這個隱含馬爾可夫鏈中節點最多的狀態有 D 個節點,也就是說整個網格的寬度為 D,那麼任何一步的複雜度不超過 O(D2),由於網格長度是 N,所以整個維特比演算法的複雜度是 O(N·D2)。

 簡明例子

1. 題目背景:

從前有個村兒,村裡的人的身體情況只有兩種可能:健康或者發燒。
假設這個村兒的人沒有體溫計或者百度這種神奇東西,他唯一判斷他身體情況的途徑就是到村頭我的偶像金正月的小診所詢問。
月兒通過詢問村民的感覺,判斷她的病情,再假設村民只會回答正常、頭暈或冷。
有一天村裡奧巴驢就去月兒那去詢問了。
第一天她告訴月兒她感覺正常。
第二天她告訴月兒感覺有點冷。
第三天她告訴月兒感覺有點頭暈。
那麼問題來了,月兒如何根據阿驢的描述的情況,推斷出這三天中阿驢的一個身體狀態呢?
為此月兒上百度搜 google ,一番狂搜,發現維特比演算法正好能解決這個問題。月兒樂了。

2. 已知情況:

隱含的身體狀態 = {健康 , 發燒}

可觀察的感覺狀態 = {正常 , 冷 , 頭暈}

月兒預判的阿驢身體狀態的機率分布 = {健康:0.6 , 發燒: 0.4}
這就是初始狀態序列。


月兒認為的阿驢身體健康狀態的轉換機率分布 = {
健康 -> 健康: 0.7 ,
健康 -> 發燒: 0.3 ,
發燒 -> 健康:0.4 ,
發燒 -> 發燒: 0.6
}

這樣就可以列出相應的狀態轉移矩陣。


月兒認為的在相應健康情況條件下,阿驢的感覺的機率分布 = {
健康,正常:0.5 ,冷 :0.4 ,頭暈: 0.1 ;
發燒,正常:0.1 ,冷 :0.3 ,頭暈: 0.6
}

這樣就可以列出相應的觀測矩陣。

由上面我們可以發現,HMM 的三要素都齊備了,下面就是解決問題了。
阿驢連續三天的身體感覺依次是: 正常、冷、頭暈 。

3. 題目:

已知如上,求:阿驢這三天的身體健康狀態變化的過程是怎麼樣的?即已知觀測序列和 HMM 模型的情況下,求狀態序列。
4. 過程:

  • 初始化。第一天的時候,對每一個狀態(健康或者發燒),分別求出第一天身體感覺正常的機率:

    P(第一天健康) = P(正常 | 健康)*P(健康 | 初始情況) = 0.5 * 0.6 = 0.3

    P(第一天發燒) = P(正常 | 發燒)*P(發燒 | 初始情況) = 0.1 * 0.4 = 0.04

  • 第二天的時候,對每個狀態,分別求在第一天狀態為健康或者發燒情況下觀察到冷的最大機率。在維特比演算法中,我們先要求得路徑的單個路徑的最大機率,然後再乘上觀測機率。

    P(第二天健康) = max{0.3*0.7, 0.04*0.4}*0.4=0.3*0.7*0.4=0.084 此時我們需要記錄機率最大的路徑的前一個狀態,即 0.084 路徑的前一個狀態,我們在小本本上記下,第一天健康。

    P(第二天發燒)=max{0.3*0.3, 0.04*0.6}*0.3=0.027, 同樣的在 0.027 這個路徑上,第一天也是健康的。

  • 第三天的時候,跟第二天一樣。

    P(第三天健康)=max{0.084*0.7, 0.027*0.4}*0.1=0.00588,在這條路徑上,第二天是健康的。

    P(第三天發燒)=max{0.084*0.3, 0.027*0.6}*0.6=0.01512, 在這條路徑上,第二天是健康的。

  • 最後一天的狀態機率分布即為最優路徑的機率,即 P(最優)=0.01512,這樣我們可以得到最優路徑的終點,是健康
  • 由最優路徑開始回溯。請看我們的小本本,在求得第三天發燒機率的時候,我們的小本本上面寫的是第二天健康,好了,第二天就應該是健康的狀態,然後在第二天健康的情況下,我們記錄的第一天是健康的。這樣,我們的狀態序列逆推出來了。即為:健康,健康,發燒。
  • 簡略的畫個圖吧:

這兒的箭頭指向就是一個回溯查詢小本本的過程,我們在編寫演算法的時候,其實也得注意,每一個機率最大的單條路徑上都要把前一個狀態記錄下來。

 

hmm和Veterbi演算法(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.