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行的結果。