【深度剖析HMM(附Python代碼)】1.前言及隱馬爾科夫鏈HMM的背景

1. 前言

隱馬爾科夫HMM模型是一類重要的機器學習方法,其主要用於序列數據的分析,廣泛應用於語音識別、文本翻譯、序列預測、中文分詞等多個領域。雖然近年來,由於RNN等深度學習方法的發展,HMM模型逐漸變得不怎麼流行了,但並不意味着完全退出應用領域,甚至在一些輕量級的任務中仍有應用。本系列博客將詳細剖析隱馬爾科夫鏈HMM模型,同以往網絡上絕大多數教程不同,本系列博客將更深入地分析HMM,不僅包括估計序列隱狀態的維特比算法(HMM解碼問題)、前向後向算法等,而且還着重的分析HMM的EM訓練過程,並將所有的過程都通過數學公式進行推導。

由於隱馬爾科夫HMM模型是一類非常複雜的模型,其中包含了大量概率統計的數學知識,因此網絡上多數博客一般都採用舉例等比較通俗的方式來介紹HMM,這麼做會讓初學者很快明白HMM的原理,但要丟失了大量細節,讓初學者處於一種似懂非懂的狀態。而本文並沒有考慮用非常通俗的文字描述HMM,還是考慮通過詳細的數學公式來一步步引導初學者掌握HMM的思想。另外,本文重點分析了HMM的EM訓練過程,這是網絡上其他教程所沒有的,而個人認爲相比於維特比算法、前向後向算法,HMM的EM訓練過程雖然更爲複雜,但是一旦掌握這個訓練過程,那麼對於通用的鏈狀圖結構的推導、EM算法和網絡訓練的理解都會非常大的幫助。另外通過總結HMM的數學原理,也能非常方便將數學公式改寫成代碼。

最後,本文提供了一個簡單版本的隱馬爾科夫鏈HMM的Python代碼,包含了高斯模型的HMM和離散HMM兩種情況,代碼中包含了HMM的訓練、預測、解碼等全部過程,核心代碼總共只有200~300行代碼,非常簡單!個人代碼水平比較渣=_=||,大家按照我的教程,應該都可以寫出更魯棒性更有高效的代碼,附上Github地址:https://github.com/tostq/Easy_HMM

覺得好,就點星哦!

覺得好,就點星哦!

覺得好,就點星哦!


重要的事要說三遍!!!!大笑

爲了方便大家學習,我將整個HMM代碼完善成整個學習項目,其中包括

hmm.py:HMM核心代碼,包含了一個HMM基類,一個高斯HMM模型及一個離散HMM模型

DiscreteHMM_test.py及GaussianHMM_test.py:利用unnitest來測試我們的HMM,同時引入了一個經典HMM庫hmmlearn作爲對照組

Dice_01.py:利用離散HMM模型來解決丟色子問題的例子

Wordseg_02.py:解決中文分詞問題的例子

Stock_03.py:解決股票預測問題的例子

 

2. 隱馬爾科夫鏈HMM的背景

首先,已知一組序列 :


我們從這組序列中推導出產生這組序列的函數,假設函數參數爲 ,其表示爲


使得序列X發生概率最大的函數參數,要解決上式,最簡單的考慮是將序列 的每個數據都視爲獨立的,比如建立一個神經網絡。然後這種考慮會隨着序列增長,而導致參數爆炸式增長。因此可以假設當前序列數據只與其前一數據值相關,即所謂的一階馬爾科夫鏈


有一階馬爾科夫鏈,也會有二階馬爾科夫鏈(即當前數據值取決於其前兩個數據值)


當前本文不對二階馬爾科夫鏈進行深入分析了,着重考慮一階馬爾科夫鏈,現在根據一階馬爾科夫鏈的假設,我們有:


因此要解一階馬爾科夫鏈,其關鍵在於求數據(以下稱觀測值)之間轉換函數 ,如果假設轉換函數同序列中位置 (時間)無關,我們就能根據轉換函數而求出整個序列的概率:


然而,如果觀測值x的狀態非常多(特別極端的情況是連續數據),轉換函數會變成一個非常大的矩陣,如果x的狀態有K個,那麼轉換函數就會是一個K*(K-1)個參數,而且對於連續變量觀測值更是困難。

爲了降低馬爾科夫鏈的轉換函數的參數量,我們引入了一個包含較少狀態的隱狀態值,將觀測值的馬爾科夫鏈轉換爲隱狀態的馬爾科夫鏈(即爲隱馬爾科夫鏈HMM)


其包含了一個重要假設:當前觀測值只由當前隱狀態所決定。這麼做的一個重要好處是,隱狀態值的狀態遠小於觀測值的狀態,因此隱藏狀態的轉換函數 的參數更少。

此時我們要決定的問題是:


在所有可能隱藏狀態序列情況下,求使得序列 發生概率最大的函數參數

這裏我們再總結下:

隱馬爾科夫鏈HMM三個重要假設:

1. 當前觀測值只由當前隱藏狀態確定,而與其他隱藏狀態或觀測值無關(隱藏狀態假設)

2. 當前隱藏狀態由其前一個隱藏狀態決定(一階馬爾科夫假設)

3. 隱藏狀態之間的轉換函數概率不隨時間變化(轉換函數穩定性假設)

隱馬爾科夫鏈HMM所要解決的問題:

在所有可能隱藏狀態序列情況下,求使得當前序列X產生概率最大的函數參數θ。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章