隱馬爾可夫模型求解三大問題實例剖析算法
HMM 模型如圖所示:網絡
1、隱馬爾可夫模型定義學習
隱馬爾可夫模型由初始機率分佈、狀態轉移機率分佈以及觀測機率分佈肯定。優化
設 Q(圖中的q)是全部可能的狀態的集合,V(圖中的O) 是全部可能的觀測的集合。ui
其中,N爲可能狀態數,M爲可能的觀測數。spa
I是長度爲T的隱藏狀態序列,O是對應的觀測序列。.net
如下三個參數(A、B、π):設計
A是狀態轉移機率矩陣:blog
其中,ci
表示在時刻t處於狀態qi的條件下在時刻t+1轉移到狀態qj的機率。
B是觀測機率矩陣:
其中,
表示在時刻t處於狀態qj 的條件下生成觀測vk的機率。
π是初始狀態機率向量:就是由空狀態轉換爲有狀態的一個機率
其中,
表示時刻t=1處於狀態qi的機率。
隱馬爾可夫模型由π、A、B決定。π和A決定狀態序列,B決定觀測序列。
隱馬爾可夫模型 λ=( A, B,π),A、B、π稱爲隱馬爾科夫模型的三要素。
隱馬爾可夫模型的兩個基本假設:
(1)齊次馬爾可夫性假設
(2)觀測獨立性假設
2、隱馬爾可夫模型的三個基本問題
問題一:機率計算問題:觀察序列的機率
給定模型λ=( A, B,π)和觀測序列
。計算在模型λ下觀測序列O出現的機率P(O|λ)。
解決此問題的方法爲前向、後向算法。
問題二:預測問題:由觀察序列求隱藏序列
好比:HMM 寫的拼音輸入法
也稱爲解碼問題。已知模型λ=( A, B,π)和觀測序列
,求對給定觀測序列條件機率P(I|O)最大的狀態序列 。即給定觀測序列、
,求最有可能的對應隱藏狀態序列
解決此問題的方法爲維特比算法。
問題三:學習問題:HMM參數估計
已知觀測序列
,估計模型λ=( A, B,π)參數,使得在該模型下觀測序列機率P(O|λ)最大。
當同時給定觀測序列和對應狀態序列時,使用極大似然估計方法估計參數。
當只給定觀測序列,沒有對應狀態序列時,基於EM算法進行參數估計。(Baum-Welch算法)
3、隱馬爾可夫模型的實例
模型實例
假設 S 是天氣情況的集合,分別是「晴天」、"多雲"、「下雨」,
其初始機率分佈爲,
晴天 |
多雲 |
下雨 |
0.63 |
0.17 |
0.20 |
其狀態轉移機率矩陣爲:
- |
晴 |
陰 |
雨 |
晴 |
0.500 |
0.375 |
0.125 |
陰 |
0.250 |
0.125 |
0.625 |
雨 |
0.250 |
0.375 |
0.325 |
假設有一位盲人住在海邊,他不能經過直接觀察天氣的狀態來預報天氣。但他有一些水藻,所以能夠利用水藻的乾溼來預報天氣。水藻的乾溼與天氣情況之間的關係以下表:
- |
乾燥 |
稍幹 |
潮溼 |
溼透 |
晴 |
0.60 |
0.20 |
0.15 |
0.05 |
陰 |
0.25 |
0.25 |
0.25 |
0.25 |
雨 |
0.05 |
0.10 |
0.35 |
0.50 |
問題1:求解觀察序列的機率
針對上述模型,咱們求p(乾燥,潮溼,溼透)。思路很簡單:
這個時候再往下計算,方法就和第一步同樣了,再也不羅嗦了。
問題2:由觀察序列肯定隱狀態序列
例如用HMM 算法來寫中文輸入法
咱們觀察到了「乾燥、潮溼、溼透」,那麼實際天氣變化的序列應該是什麼呢?會是憑直覺猜想的「晴、陰、雨」這個序列嗎?
解決這個問題的關鍵是,如何計算p(晴陰雨|乾燥 潮溼 溼透)?我畫了一張圖,只要把黑色路徑上標註的初始機率、轉移機率、發射機率連乘起來,就獲得這條路經的機率。
ok,如今問題變成了如何從開始到結束找到一條几率最大的路徑。問題轉化成了路徑最優化問題,能夠用動態規劃方法解決,我不想再囉嗦了,剩下的任務你們自行解決吧。
問題3:HMM參數估計
假設隱馬爾可夫模型的觀測序列是「乾燥,潮溼,溼透,…」,那麼,隱馬爾可夫模型的參數A,B,π 如何設置,才能使這個觀測序列出現的機率最大?這就是所謂的隱馬爾可夫模型參數估計問題。
參照上圖,從起點到終點共計27條路徑,把這些路徑的機率所有加起來,就是「乾燥,潮溼,溼透」發生的機率。若是圖中箭頭隨對應的機率所有爲未知,能夠想一想,最終的結果就能夠用這些參數表示。所以問題可描述爲,這些參數取何值時,所求機率最大。
上圖中的實例, 計算觀察序列的機率應該不須要遍歷27條路徑,這樣複雜度過高了。這個問題你們自行考慮吧。
轉移機率矩陣和發射機率矩陣在多個環節重複出現,讓我聯想起卷積神經網絡的卷積層設計,扯得有點遠。可是,這個機率網絡求解總體過程的確與神經網絡相似。
一個很差的消息是,沒辦法用公式求解此最優化問題。一個稍好一點的消息是,能夠用梯度降低法,求局部極小解,這簡直是廢話。還有一個稍好點的消息,Baum-Welch算法能夠解決此問題,思路相似EM算法,思路也很簡單,
Baum-Welch算法
好比,先假設狀態序列爲已知,參見下表。和EM算法套路同樣,能夠看看《簡析EM算法(最大指望算法)》。
t |
觀察值 |
晴朗 |
多雲 |
下雨 |
1 |
乾燥 |
1 |
0 |
0 |
2 |
潮溼 |
0 |
1 |
0 |
3 |
溼透 |
1 |
0 |
0 |
4 |
潮溼 |
0 |
0 |
1 |
5 |
乾燥 |
0 |
1 |
0 |
6 |
潮溼 |
1 |
0 |
0 |
7 |
溼透 |
0 |
0 |
1 |
… |
… |
… |
… |
… |
狀態的出現次數爲0或1,和EM算法是徹底同樣的套路。若是出現100次"晴朗"
,其中對應70次「乾燥」,則能夠估計「晴朗」向「乾燥」發射機率爲70/100=0.7,如此類推,能夠求出模型中的全部機率值。
如今的問題是,狀態出現的次數是不知道的。依據EM算法思路,能夠隨機給模型參數賦值(固然要保證數據的合理性)。好比,根據「晴朗」、「陰天」、「下雨」向「乾燥」的發射機率,把狀態出現次數1按比例分配給三個狀態。這樣就能夠按照上面的方法從新計算模型的參數了。如此類推,直到模型參數收斂爲止。
狀態轉移機率,也能夠統計出來。好比從上表一、2兩行能夠獲得「晴天」到「多雲」轉移累計計數1次。在EM算法中,這個計數可能變成了用小數表示的模糊計數,不過不要緊,同樣能夠獲得這個累計計數。
初始機率計算也是一樣道理,用模糊計數方法能夠幫助估計機率分佈。
參考博客和書籍:
http://www.javashuo.com/article/p-cuerkhbl-eq.html
https://blog.csdn.net/lrs1353281004/article/details/79417225
《統計學習方法》李航