文章目錄
引入
爲了更方便地理解隱馬爾可夫模型,我們需要引入以下概念。
盒子模型與盒子問題(urn problem)
所謂盒子問題,就是將感興趣的實體視爲一系列的,帶有顏色的球。之後,人們從盒子中取出一個或多個的球,再根據這些球,估算某些概率或概率分佈。比如,估計某種顏色的球出現的概率。
所謂盒子模型,就是根據盒子問題引發而出的模型。最簡單的盒子模型如下:
假設有一個盒子問題,盒子中包含兩種顏色的球和,分別代表黑白,於是盒子模型有如下:
- 在置信水平中從次抽樣中,推斷黑白顏色的球的比重。
- 在知道兩種顏色的球的比重後,推斷次抽樣中,抽樣序列出現的概率(如,抽取出一黑一白這樣的序列)
- 如果次抽樣中均遇到白球,那麼在置信水平下,盒子中無黑色球的概率。
隨機過程
隨機過程可以定義爲一系列於概率空間中的隨機變量,其中爲採樣空間,爲事件空間,而爲概率公理化定義。這些隨機變量,都有一個索引,就像數組的下標一樣。索引跟隨機變量一樣,其在一個度量空間中,其中爲取值空間,爲度量空間,例如時間的時分秒、或者長度單位的連續空間,反正能夠被統一的標準度量就行了。這些數學概念都比較較真,其實理解起來非常的通俗。大家可以略過。
簡單來說,隨機過程就是一個數組,數組中的每一個元素爲隨機變量,數組的索引可能不是0開始的整數序列。
用更加精確的定義,就是給定一個概率空間,和度量空間,然後隨機過程就是一個隨機變量的集合,集合中的每個元素都有索引:
在歷史定義中,都認爲是時間序列。於是就是某一個時刻的觀察下,隨機變量序列的取值。隨機過程亦可以寫成,表示隨機序列的最終取值由兩個變量決定,一是索引,二是抽樣空間。
索引集
爲索引集。其通常爲一個線性、一維的子集。比如自然數序列,於是通過這樣的線性序列,就可以解釋隨機序列的實時性了。當然,索引集亦可以用笛卡爾平面,或多維平面表示,此時可以表徵空間上的一個點。
狀態空間
狀態空間爲隨機變量的不同取值可能構成的空間。
採樣函數
採樣函數爲隨機過程的一種結果,其可以用如下表達:
增量
隨機過程的增量,可以視爲隨機過程通過兩個採樣函數後,其結果的差。如下:
,,且。於是,隨機序列的增量爲:
馬爾可夫鏈與馬爾可夫過程
馬爾可夫鏈是描述隨機事件序列的隨機模型。並且,每一個事件只取決於上一個事件的狀態。其可以視爲一個隨機過程,因此也叫馬爾可夫過程。如圖所示:
以上是隨機事件爲2的馬爾可夫過程,其中數字代表轉換的概率。
隱馬爾科夫模型定義
令分別爲離散時間的隨機過程,。於是數對就是一個隱馬爾科夫模型,當且僅當:
- 爲一個馬爾可夫過程,且其不能被直接觀察,是隱藏的
其中,被稱爲隱藏狀態,爲發射概率。
示例——幫助理解
精靈、盒子與球
假設在一個觀察者不可見的房間中,有一個小精靈、若干個盒子、若干個不同標籤的小球。假設盒子中包含的球都是已知的(對盒子有先驗認識)。
小精靈根據某種規則,從任意一個盒子中,隨機抽取出一個小球,並把他放到一個傳送帶中。外面的觀察者通過傳送帶,觀察到小精靈抽取出來的小球,但卻不能觀察到精靈是從哪個盒子抽取出來的。另外,小精靈抽取的規則,與其上一次抽取的盒子有關,但不僅僅是(即還夾雜着某些其他因素)。
於是,讓我們假設盒子爲,而小球爲。如圖所示,小球馬爾可夫序列是不可見的,而小球是可見的。因此,對於這種序列,也稱之爲隱馬爾科夫模型序列。假設小精靈從中抽取三個小球放到傳送帶中,但觀測者仍舊無法看出小精靈的第三個小球是從哪個盒子抽取的。然而,卻可以推斷出,第三個小球來源於這些盒子的概率。
天氣估計
假設有兩個夥伴 A 和 B,A是個超級大宅男,B是一個受習慣支配的超級單調鬼。雖然 A 喜歡宅在家裏,但是他要通過 B 知道今天的天氣如何。於是,每天 A 就會打電話給 B,詢問 B 今天做了什麼?而如是回答也是 B 的習慣之一。
已知單調鬼 B 一天只喜歡做一件事,並且無外乎這三件中的一件:散步、購物和打掃衛生。並且,每天做哪件事,取決於今天的天氣。於是,B今天做了哪件事,就是可以觀察到的 y,而今天的天氣,對 A 來說,就是觀察不到的 X。
用 Python 描述:
states = ('Rainy', 'Sunny') #假設天氣只有晴雨天兩種可能。
observations = ('walk', 'shop', 'clean')
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
transition_probability = {
'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
}
emission_probability = {
'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}
表示成圖像,如下所示:
其中,開始概率是 A 向 B 詢問的第一天,根據他的統計得到的可能概率,或者說第一印象。因此,天氣、B做的事情,就可以視爲兩個 隨機過程,兩者組成一個 隱馬爾科夫模型。其中,天氣爲 隱馬爾科夫過程。
原理描述
以下是隱馬爾科夫模型的數學描述,先放上圖:
如上圖所示,是隨機變量,在時間的一個隱藏狀態(不可見),比如。而隨機變量是觀察變量(可見)在時的取值,比如。而箭頭表示條件依賴。
其中,時刻的隨機變量,僅條件依賴於時刻的。同樣的,時刻的隨機變量,僅條件依賴於時刻的。這種屬性稱爲馬爾可夫屬性。
的狀態空間是離散的,而可以是離散的(服從範疇分佈),或連續的(服從正態分佈)。隱馬爾科夫模型的參數有二:一是轉移參數,其表示隱藏狀態之間狀態轉換的概率,決定着到的轉變。二是發射參數,其表示某個隱藏狀態下,輸出各個觀測(y)的概率。
另外,對於轉移參數,設隱藏狀態的取值可能爲N個。則轉移參數共個。由於一個狀態,轉移到其他狀態的概率和爲1,故所需要求解的轉移參數有個。
- 設觀測變量屬於離散取值,且可能取值爲M個,則發射參數共個。同樣,由於概率和爲1,故所需要求解的發射參數共個。
- 若屬於連續性變量,則可以用正態分佈擬合它。設輸出爲一個向量,向量的長度爲M。於是,所需要求解的正態分佈的參數爲M個均值、以及個參數的協方差。因此,所需要求解的發射參數就是個。
推斷問題
瞭解以上概念後,隱馬爾科夫模型有什麼用呢?
估算觀測序列出現的概率
給定觀測序列:,求出其概率,其中累加遍歷所有的。
計算隱藏變量的概率
即根據觀測序列,計算變量(一個或多個)
過濾問題
計算,而均未知。通常採用前向算法計算出。
平滑問題
平滑問題與過濾類似,其不是計算終端隱藏變量,而是計算序列中間的隱藏變量。即其中
最可能解釋問題
最可能即使計算的是隱藏變量序列的出現的聯合概率。一般用在諸如序列標註的問題上。比如給定一些詞彙,然後判斷每個詞彙的詞性。
如上所示,已知觀測序列如上。如是可以獲得幾個候選序列:
5 3 2 5 3 2
4 3 2 5 3 2
3 1 2 5 3 2
於是,我們可以從這些序列的聯合概率中,找到最優可能的序列。這類問題一般可以用維特比算法解決。
模型訓練
模型訓練的過程,其實就是根據數據集(序列數據),來學習隱馬爾科夫模型的參數
實現
綜上,隱馬爾科夫模型(以下稱爲HMM)用於解決下面三個問題:
- 根據模型參數和觀測序列,找出最優可能的隱藏序列
- 根據模型參數以及觀測數據,計算likelihood(概率)
- 根據觀測數據,計算模型參數(訓練)
搭建一個 HMM 併產生數據集
import numpy as np
from hmmlearn import hmm
np.random.seed(42)
model = hmm.GaussianHMM(n_components=3, covariance_type="full")
model.startprob_ = np.array([0.6, 0.3, 0.1])
model.transmat_ = np.array([[0.7, 0.2, 0.1],
[0.3, 0.5, 0.2],
[0.3, 0.3, 0.4]])
model.means_ = np.array([[0.0, 0.0], [3.0, -3.0], [5.0, 10.0]])
model.covars_ = np.tile(np.identity(2), (3, 1, 1))
Y,X = model.sample(100) #其中X爲隱藏序列、Y爲標註序列
運行上述代碼,生成的數據集如下:
Y:
X: