隱馬爾可夫模型及的評估和解碼問題

http://www.cnblogs.com/zhangchaoyang/articles/2219571.html

HMM介紹

Hidden Markov Models是一種統計信號處理方法,模型中包含2個序列和3個矩陣:狀態序列S、觀察序列O、初始狀態矩陣P、狀態轉移矩陣A、混淆矩陣B。舉個例子來說明。

你一個異地的朋友只做三種活動:散步、看書、做清潔。每天只做一種活動。假設天氣只有兩種狀態:晴和兩。每天只有一種天氣。你的朋友每天告訴你他做了什麼,但是不告訴你他那裏的天氣。

某一週從週一到週五每天的活動分別是{讀書,做清潔,散步,做清潔,散步}----這就是觀察序列O,因爲你可以觀察得到。

從週一到週五的天氣依次是{晴,兩,晴,晴,晴}----這就是狀態序列S,狀態序列是隱藏的,你不知道。

根據長期統計,某天晴的概率是0.6,兩的概率是0.4。則

從晴轉晴的概率是0.7,從晴轉兩的概率是0.3。從兩轉晴的概率是0.4,從兩轉兩的概率是0.6。則

天氣晴時,散步的概率是0.4,看書的概率是0.3,做清潔的概率是0.3。天氣兩時,散步的概率是0.1,看書的概率是0.4,做清潔的概率是0.5。則

該模型和實際情況有明顯不符的地方:用一簡單的狀態轉移矩陣A來表示狀態的轉移概率的前提是t時刻的狀態只跟t-1時刻的狀態有關,而實際上今天的天氣跟過去幾天的天氣都有關係,而且跟過去幾天的晴朗程度、兩量大小都有關係;混淆矩陣B認爲今天的活動只跟今天的天氣有關係,實際上今天的活動跟過去幾天的活動也有關係,比如過去一週都沒有打掃房間,那今天做清潔的概率就大大增加。

模型介紹完了。

評估問題

隱馬爾可夫模型中包含一個評估問題:已知模型參數,計算某一特定輸出序列的概率。通常使用forward算法解決。 

比如計算活動序列{讀書,做清潔,散步,做清潔,散步}出現的概率,就屬於評估問題。

如果窮舉的話,觀察序列會有2^5種,需要分別計算它們出現的概率,然後找出概率最大的。

窮舉法中有很多重複計算,向前算法就是利用已有的結果,減少重複計算。

算法藉助於一個矩陣Q[LEN][M],其中M是所有狀態的種數,Q[i][j]表示從第0天到第i天,滿足觀察序列,且第i天隱藏狀態爲Sj的所有可能的隱藏序列的概率之和。最終所求結果爲Q[LEN-1][0]+...+Q[LEN-1][M-1],即最後一天,所有隱藏狀態下,分別滿足觀察序列的概率值之和。

比如Q[0][0]=p(第一天做衛生 且 第一天晴)=p(天晴)*p(做衛生|天晴)=P[0]*B[0][2]=0.6*0.3=0.18

Q[0][1]=p(第一天做衛生 且 第一天下雨)=p(下雨)*p(做衛生|下雨)=P[1]*B[1][2]=0.4*0.5=0.2

Q[1][0]=p(第一天做衛生 且 第二天晴 且 第二天做衛生)

=p(第一天做衛生 且 第二天晴)*p(天晴的情況下做衛生)

=p{ p(第一天做衛生 且 第一天晴)*p(從天晴轉天晴)+p(第一天做衛生 且 第一天下雨)*p(從下雨轉天晴) }*p(天晴的情況下做衛生)

={ Q[0][0]*A[0][0] + Q[0][1]*A[1][0] } * B[0][2]

Q[1][1]= ……

…… ……

可以看到計算Q矩陣的每i行時都用到了第i-1行的結果。

解碼問題

解碼問題是:已知模型參數,尋找最可能的能產生某一特定輸出序列O(LEN)的隱含狀態的序列。通常使用Viterbi算法解決。 

觀察序列長度爲LEN,則隱藏狀態序列長度也是LEN,如果採用窮舉法,就有M^LEN種可能的隱藏狀態序列,我們要計算每一種隱藏狀態到指定觀察序列的概率,最終選擇概率最大的。

窮舉法中有很多重複計算,Viterbi算法就是利用已有的結果,減少重複計算。

跟評估問題非常相似,不同點在於評估算的是和,解碼算的是最大值。

Viterbi算法主要就是在計算一個矩陣Q[LEN][M],其中Q[i][j]表示從第0天到第i天,滿足觀察序列,且第i天隱藏狀態爲Sj的所有可能的隱藏序列的概率的最大值。另外還要建立一個矩陣Path[LEN][M],用來記錄狀態序列中某一狀態之前最可能的狀態。

舉個例子,假如指定觀察序列是{讀書,做衛生,散步,做衛生,散步},求出現此觀察序列最可能的狀態序列是什麼。

Q[0][0]=p(第一天讀書 且 第一天晴)=p(天晴)*p(讀書|天晴)

Path[0][0]=-1;

Q[0][1]=p(第一天讀書 且 第一天下雨)=p(下雨)*p(讀書|下雨)

Path[0][1]=-1;

關鍵是從第二天開始,Q[1][0]表示:滿足“第一天讀書 且 第二做衛生 且 第二天晴”的所有可能的隱藏序列的概率的最大值。那麼滿足“第一天讀書 且 第二做清潔 且 第二天晴”的所有可能的隱藏序列有哪些呢?第二天是必須滿足晴天的,第二天之前的狀態可以任意變。則所有可能的隱藏序列就是“晴  晴”和“雨  晴”。實際上考慮第三天(及第三天以後)時,並不需要考慮“所有”可能的隱藏序列,而只需要考慮第二天的不同狀態取值,這是因爲馬氏過程有無後效性--tm時刻所處狀態的概率只和tm-1時刻的狀態有關,而與tm-1時刻之前的狀態無關。

Q[1][0]=

max{ p(第一天晴 且 第一天讀書 且 第二天晴 且第二天做衛生) ,p(第一天下雨 且 第一天讀書 且 第二天晴 且 第二天做衛生) }

=max{ p(第一天讀書 且 第一天晴)*p(天晴轉天晴),p(第一天讀書 且 第一天下雨)*p(下雨轉天晴) } * p(做衛生|天晴)

=max{ Q[0][0]*A[0][0],Q[0][1]*A[1][0] } * B[0][2]

假如Q[0][0]*A[0][0] < Q[0][1]*A[1][0],則Path[1][0]=1;假如Q[0][0]*A[0][0] > Q[0][1]*A[1][0],則Path[1][0]=0。

Q[1][1]= ……

…… ……

可以看到計算Q矩陣的每i行時都用到了第i-1行的結果。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章