HMM算法想必大家已經聽說了好多次了,完全看公式一頭霧水。但是HMM的基本理論其實很簡單。因為HMM是馬爾科夫鏈中的一種,只是它的狀態不能直接被觀察到,但是可以通過觀察向量間接的反映出來,即每一個觀察向量由一個具有相應概率密度分布的狀態序列產生,又由于每一個狀態也是隨機分布的,所以HMM是一個雙重隨機過程。
HMM是語音識別,人體行為識別,文字識別等領域應用非常廣泛。
一個HMM模型可以用5個元素來描述,包過2個狀態集合和3個概率矩陣。其分別為
隱含狀態S,可觀測狀態O,初始狀態概率矩陣π,隱含狀態概率轉移矩陣A,觀測狀態轉移概率矩陣 B。
HMM在實際應用中主要用來解決3類問題。
即給定觀測序列 O=O1O2O3…Ot和模型參數λ=(A,B,π),怎樣有效計算這一觀測序列出現的概率
即給定觀測序列 O=O1O2O3…Ot和模型參數λ=(A,B,π),怎樣尋找滿足這種觀察序列意義上最優的隱含狀態序列S。
即HMM的模型參數λ=(A,B,π)未知,如何求出這3個參數以使觀測序列O=O1O2O3…Ot的概率盡可能的大。
這篇文章是針對第一個問題來說的,一般采用的是前向后向算法來解決評估問題。這里將的是前向算法。
在此之前,先引入幾個符號:
at(i) : 表示到第t個觀察值Ot時處于狀態i。
現在來看一下前向算法的理論來源。
因為我們要解決的是模型估計問題。即計算概率
因此首先要先計算
其中
所以
因此最后求得
由此可以看見其計算復雜度非常大,為
為了解決這個問題,前向算法就出現了。首先定義了一個前向變量 。表示從1到t,輸出符號o序列,t時刻處于狀態i的累計輸出概率。
因為前向變量有如下性質:
初值:
為什么這樣就可以簡化計算復雜度呢?其原因很簡單,因為每一次的at(i),我們都可以用at-1(i)來計算,就不用重復計算了。如下示意圖可以幫助我們形象的理解:
看了這么多公式,是不是頭暈了?不急,下面看一個實例就會完全明白的。
題目:HMM模型如下,試通過前向算法計算產生觀察符號序列O={ABAB}時每個時刻的 和總概率。
當然初始概率矩陣π=(1,0,0),即開始處于狀態1。按照上面的公式理論,我們的遞推依次解出at(i)。解法如下:
t=1時:
t=2時:
t=3時:
t=4時:
所以有最后的結果:
最后將其計算過程示意圖表示如下: