隱馬爾科夫模型前向後向演算法

hearthougan發表於2017-09-13

    本文是自己學習隱馬爾科夫模型的一個總結,為了自己以後方便查閱,也算作是李航老師的《統計學習方法》的一個總結,若有疑問,歡迎討論。

推薦閱讀知乎上Yang Eninala寫的《如何用簡單易懂的例子解釋隱馬爾可夫模型?》,寫的非常好。我會聯絡兩者,來作為自己的一篇學習筆記。

    隱馬爾可夫模型: 隱馬爾可夫模型是關於時序的概率模型,描述由一個隱藏的馬爾可夫鏈隨機生成不可觀測的狀態隨機序列,再由各個狀態生成一個觀測而產生觀測隨機序列的過程。隱藏的馬爾可夫鏈隨機生成的狀態的序列,稱為狀態序列(state sequence),每個狀態生成一個觀測,而由此產生的觀測的隨機序列,稱為觀測序列(observation sequenoe )。序列的每一個位置又可以看作是一個時刻。















隱馬爾科夫模型的3個基本問題:

     (1)概率計算問題。給定模型和觀測序列,計算在模型下的觀測序列出現的概率

    (2)學習問題。已知觀測序列,估計模型引數,使得在該模型下觀測序列概率最大。

    (3)預測問題,也稱為解碼(decoding)問題。已知模型引數和觀測序列,求對給定觀測序列前提下,條件概率最大的狀態序列。即給定觀測序列,求最有可能的對應的狀態序列

概率計算問題:
1、 直接計算方法
    這種方法說白了就是暴力搜尋,列舉每一種狀態序列,然後在根據狀態序列求出觀測序列的概率。
    思想很簡單,可以這麼想:假如我們現在已知狀態序列為,那麼根據狀態序列S,求觀測序列的概率,不就是相應的輸出概率的連乘麼!滿足假設的狀態序列總共有,然後對所有假設的狀態得出的概率相加,即為。細化如下:

    狀態序列的概率是


    對已經假設的狀態序列,觀測序列,的概率是


    觀測序列O和狀態序列S同時出現的概率是:


    最後,對所有的狀態序列S求和,即可得到觀測序列O的概率

    對於實現上式,很簡單,個for迴圈即可列舉所有的狀態,然後計算每種狀態對應的觀測概率,時間複雜度是O(T),因此要直接計算的話,總的時間複雜度為,當資料量稍微大一點,具體實施就不太可能,因此要實現HMM的第一個問題,就要換一種方法。

2、前向演算法:

    給定隱馬爾可夫模型,定義到時刻t部分觀測序列且狀態為的概率為前向概率,記作

    可以遞推地求得前向概率及觀測序列概率

    這個可以這麼理解,已知選每種骰子的概率,每種骰子的輸出概率,那麼前t次擲骰子,擲出的點數為,並且第t用的骰子是,的概率是就是

(1)初值:

【第一次擲的是骰子是,擲出的點數為的概率,其中表示開始的時候選用骰子的概率】

(2)遞推:


【第t+1次用骰子,擲出的概率】

    上式方括號中,表示第t次使用骰子擲出點數的的概率,,表示前t次擲出點數為的概率×第t+1次使用骰子的概率。

    由於第t次骰子的種類有N種,因此,第t+1次使用,而前一次,也就是第t次,使用的骰子有N種可能,即如下圖:


(3)終止:


    根據(2)的遞推式子可以求出表示第T次使用可以產生序列,i仍有N中可能所以相加即為最終的結果。

    例子1(前向演算法):考慮盒子和球模型,狀態集合,觀測集合,並且有:


,試用前向演算法計算

根據上面我們描述的演算法,一步一步地計算,

(1)計算初值:




(2)遞推:

     當時:







    當時:








3、後向演算法

    給定隱馬爾可夫模型,定義在時刻t部狀態為的條件下,從的部分觀測序列為的概率為後向概率,記作:


可以遞推地求得後向概率及觀測序列概率

   可以這麼理解,已知第t次擲骰子所用的骰子是,那麼它表示的就是從次到第次的看到的點數為:的概率

(1)初值


【解釋:已知最後一次所用的骰子為,那麼第次之後,為任意值的概率,故而為1】

(2)遞推


(3)終止



    後向演算法依舊是解決概率計算問題,只不過是兩種計算方式,計算結果應該是和前向演算法相同,可以用例1驗證一下,如下:

    例2(後向演算法),考慮盒子和球模型,狀態集合,觀測集合,並且有:


,試用後向演算法計算。
    我們仍然根據上面的演算法描述,一步一步地計算,

(1)計算初值

    當


(2)遞推

    當時:







    當







(3)終止




可以根絕前向演算法和後向演算法的定義,將兩種計算方式結合起來,如下:




相關文章