這篇文章寫得實在是通俗易懂,做者幽默的解釋了Markov和隱Markov模型,入門必看。算法
同前面同樣,由於編輯器不支持latex方式的數學公式輸入,因此我就試圖用文字的方式來簡要描述一下隱Markov模型(Hidden Markov Model,HMM)。全部這類模型都有一個前提假設,就是下一個時刻的狀態只與當前時刻相關。知足這種特性的過程就是Markov過程。可能有人會馬上 聯想到物理學中的絕對論,Laplace當年豪邁地宣稱,只要給定某個時刻宇宙的所有狀態,那麼理論上咱們能夠計算出宇宙的下一時刻的所有狀態,以至能夠 計算出宇宙的無限將來。可是,Markov過程與Laplace決定論仍是有本質區別的。區別在於,決定論下一時刻的狀態徹底由當前時刻決定;而 Markov過程下一時刻的狀態可能有多種,知道了當前時刻的狀態,咱們只能知道下一時刻可能會出現哪些狀態,這些狀態出現的機率如何。所 以,Markov過程更接近量子物理,固然,這種接近僅僅在機率這一點上。編輯器
回到咱們的主題。談到隱Markov模型,那麼咱們天然就先想知道不隱的Markov模型是啥。咱們來看一個例子。按照咱們的感受,若是今天下雨,那麼我 們認爲明天也下雨的可能性是至關高的;而若是今天豔陽高照,那麼明天也很是多是晴天。這能夠說就是知足了前述的Markov假設。咱們把天氣的狀態分紅三種:晴天、陰天、雨天。那麼咱們就能夠根據咱們的經驗獲得狀態之間的轉移機率, 從而造成一個矩陣。而且咱們注意到,前面所說的這個事情是與時間無關的。也就是,今年的狀況是這樣,明年的狀況也應該是這樣,這個轉移機率矩陣是不隨時間 而變化的。那麼咱們知道了初始狀態後就能夠計算將來某個時刻系統可能處於的狀態的機率,這是很是簡單的一個計算。這樣一個模型就是所謂的Markov模 型。學習
可是,做爲男人,咱們就甘心玩這種簡單得不能再簡單的遊戲嗎?顯然不能!再簡單的東西咱們也要玩出花樣來,至少讓別人看了能嚇一跳,然後翹起大拇指說:你 牛!因此,隱Markov模型就應運而生了。記住咱們的宗旨,咱們的宗旨是要嚇住別人,而嚇住別人的最好辦法就是一環套一環。你看,地球火星都繞着太陽 轉,這是簡單得不能再簡單的圓。可若是我說地球是中心,然後讓你計算火星的運動軌跡,這馬上嚇倒一大片。當年地心說盛行之時,這種一輪套一輪的天體計算着 實是把至關多的熱情少年拒之門外。而隱Markov過程也是引入了兩個隨機過程,而且隱去中間一個環節,讓一切看起來複雜而不簡單。遞歸
咱們繼續前面的例子。在計算已知當前天氣狀況,推導將來天氣狀況的問題時,咱們感受很輕鬆。那麼如今咱們進一步將問題複雜化。咱們這有一個老先生,他中午 有時候午休,有時候不午休。奇怪的是,他的這個做息規律跟天氣有必定的關係。若是是晴天,他午休的機率更大一點;而若是是雨天,他不午休的機率更大一點。 這個老先生一日突發奇想,他把前面咱們說的轉移機率以及三種天氣條件下他午休的機率整理好發給他遠在異地的兒子,他還告訴他兒子最近一週的每一天他是午休 了仍是沒午休。他要考考他兒子,從他這一週的做息狀況可否得出家鄉這一週最可能的天氣狀況。這就是一個典型的隱Markov問題。遊戲
要解決這個問題咱們必須注意到一點:這是一個最優問題,而且這個最優問題存在最優子結構。若是咱們標記這個時間序列是1到7,那麼對於這個問題一個最優解 若是是q[1]到q[7]標記的一個天氣狀態序列,那麼對於一個子問題1到6,q[1]到q[6]標記的狀態序列必然是這個子問題的最優解。咱們能夠很輕 鬆地證實這一點,由於若是存在其餘的解是最優解,那麼咱們能夠將這個最優解移植過來,那麼q[1]到q[7]造成的狀態序列就不是當前問題的最優解了。另 外,這個問題也具有重疊子結構的特徵,因此他適合用動態規劃算法。固然,在這裏,他換了一個名字,叫Viterbi算法。數學
事實上,上面這個問題僅僅是隱Markov模型的三個經典問題中的一種,即所謂的「解碼問題」。這類問題是隱去了狀態序列(對應到最近一週天天的天氣情 況),而根據觀察值序列(對應到老先生最近一週的天天做息狀態)來估計最可能的狀態序列(解碼)。隱Markov模型還涉及另外兩個問題:it
1. 評估問題。就是知道了模型的各個參數(對應到咱們這裏所說的轉移機率矩陣,三種天氣狀況下的午休機率),咱們來計算一下某個觀察值序列發生的機率;入門
2. 學習問題。對於一個給定的觀察值序列,咱們想經過修改模型參數,使得這個觀察值序列發生的機率最大。方法
下面咱們來一一考察這三個問題。先來第一個問題。咱們首先考慮最簡單的一個狀況,整個序列長度就是1,也就是咱們只考察一個觀察值出現的機率。這顯然就將各個狀態初始出現的機率乘以各個狀態中出現觀察值的機率獲得的結果加起來求和。如今咱們再來看兩個觀察值的情形。咱們仍然但願這個時候可以獲得各個狀態出現的機率,然後乘以各自的觀察值出現機率,最後求和。而各個狀態出現的機率並不可貴出:由於咱們已經有了初始時刻各個狀態出現機率,也有了狀態轉換機率。因而兩個觀察值情形咱們也能很輕鬆解決。推而廣之,咱們就能夠用一個遞歸的方式完成這個問題。經驗
再來考察第二個問題。咱們前面已經說過,第二個問題事實上就是一個動態規劃問題。有不解者,請參考教科書相關章節。
學習問題的一個通行解法是迭代算法。也就是,先憑經驗估計一組參數值,然後每計算一步就改進一步參數值,直到相鄰兩次計算出來的機率小於一個閾值。這裏關鍵的問題就是如何根據這一步的計算結果來改進參數值。更具體的就是咱們要從新計算狀態轉換機率和隨機過程的觀察值出現機率。先看狀態轉移機率。咱們計算系統從狀態 i 跳轉到狀態 j 無非就是要計算從 i 跳轉到 j 的預期次數和從 i 跳出的預期總次數,然後將二者相除。那麼從i 跳轉到j 的次數如何計算呢?提及來,步驟倒簡單。咱們先計算時刻t系統處於狀態i而時刻t+1系統處於j狀態的機率,然後將這個機率對t求和。這是顯而易見的。而且若是繼續對j求和,咱們還能夠獲得從i跳出的總次數。關鍵就是這個t時刻處於i而t+1時刻處於j的機率如何求?這是關鍵。
故事仍是要從頭講起。咱們以前在計算評估問題時已經計算過某個時刻出現某個狀態i的機率。事實上,這種作法叫前向法。咱們徹底能夠後向地計算評估問題,就是計算某個時候之後出現某個狀態序列的機率。有了這兩個機率,咱們能夠簡單地用前向機率乘以轉換機率乘以後向機率這樣的方法來計算t時刻處於i而t+1時刻處於j的機率。固然,這只是語言的描述,讀者應當去看相關文獻以獲得更精確的數學表達式。
咱們還須要計算狀態j下出現觀察值k的機率。同前面同樣,咱們就是要計算出現狀態j以及觀察值是k的次數除以出現狀態j的次數。後者咱們已經計算過了,而前者其實也簡單。由於咱們已經知道了觀察值序列,因此咱們只要挑出t時刻出現觀察值k的那些來求和便可。這樣整個算法就完成了。這個算法也有一個名字,叫Baum-Welch算法。