HMM隱馬爾科夫模型

  1. 寫在前面

隱馬爾科夫模型,簡稱HMM(Hidden Markov Model),是一種基於機率的統計分析模型,用來描述一個系統隱性狀態的轉移和隱性狀態的表現機率。 算法

本文適用於對HMM感興趣的入門讀者,爲了讓文章更加通俗易懂,我會多闡述數學思想,儘量撇開公式,撇開推導。 spa

  1. 從擲骰子提及

假設我手裏有三個不一樣的骰子: 3d

a) 第一個骰子是咱們日常見的骰子(稱這個骰子爲D6),6個面,每一個面(1,2,3,4,5,6)出現的機率是1/6. blog

b) 第二個骰子是個四面體(稱這個骰子爲D4),每一個面(1,2,3,4)出現的機率是1/4. 數學

c)第三個骰子有八個面(稱這個骰子爲D8),每一個面(1,2,3,4,5,6,7,8)出現的機率是1/8. it

如今開始擲骰子: io

挑骰子:從三個骰子裏挑一個(挑到每個骰子的機率都是1/3) 入門

③ 擲骰子:將獲得一個數字(1,2,3,4,5,6,7,8中的一個) bfc

不停的重複上述過程,咱們會獲得一串數字,例如咱們可能獲得這麼一串數字(擲骰子10次): transition

咱們稱這串數字叫作可見狀態鏈。

在隱馬爾科夫模型中,不只僅有這麼一串可見狀態鏈,還有一串隱含狀態鏈。在這個例子裏,這串隱含狀態鏈就是你用的骰子的序列。好比,隱含狀態鏈有多是:

通常來講,HMM中說到的馬爾科夫鏈實際上是指隱含狀態鏈,由於隱含狀態(骰子)之間存在轉換機率(transition probability)。

在這個例子裏,D6的下一個狀態是D4,D6,D8的機率都是1/3。D4的下一個狀態是D4,D6D,D8的機率都是1/3,D8的下一個狀態是D4,D6,D8的轉換機率也是1/3.咱們其實能夠隨意設定轉換機率的,好比咱們能夠這樣定義:D6後面不能接D4,D6後面是D6的機率是0.9,是D8的機率是0.1。這樣就是一個新的HMM。

一樣的,儘管可見狀態直接沒有轉換機率,可是隱含狀態和可見狀態之間有一個機率叫作輸出機率(emission probability)。就咱們的例子來講,六面骰子(D6)產生1的輸出機率是1/6;產生2,3,4,5,6的機率也都是1/6。咱們一樣能夠對輸出機率進行其餘的定義。好比,我有一個被賭場動過手腳的六面骰子,擲出來是1的機率更大,是1/2,擲出2,3,4,5,6的機率是1/10.

其實對於HMM來講,若是提早知道全部隱含狀態之間的轉換機率和全部隱含狀態到全部可見狀態的輸出機率,作模擬是至關容易的。但在實際運用中,每每會缺失一部分信息:有時候你知道骰子有幾種,每種骰子是什麼,可是不知道擲出來的骰子序列;有時候你知道骰子序列,剩下的什麼都不知道。如何應用算法去估計這些缺失的信息,就成了一個頗有研究價值的問題。這些算法我會在下面詳細講。

和HMM模型相關的算法主要分爲三類,分別解決三種問題:

知道骰子有幾種(隱含狀態數量),每種骰子是什麼(轉換機率),根據擲骰子擲出來的結果(可見狀態鏈),我想知道每次擲出來的都是哪一種骰子(隱含狀態鏈)。這個問題,在語音識別領域,叫作解碼問題。這個問題其實有兩種解法,會給出兩個不一樣的答案。每一個答案都對,只不過這些答案的意義不同。第一種解法求最大似然狀態路徑,說通俗點,就是我求一串骰子序列,這串骰子序列產生觀測結果的機率最大。第二種解法,就不是求骰子序列了,而是求每次擲出的骰子分別是某種骰子的機率。好比說我看到結果後,我能夠球的第一次擲骰子是D4的機率是0.5,D6的機率是0.3,D8的機率是0.2.第一種解法我會在下面說到,可是第二種解法就不寫在這裏了。

 

仍是知道骰子有幾種(隱含狀態數量),每種骰子是什麼(轉換機率),根據擲骰子擲出的結果(可見狀態鏈),我想知道擲出這個結果的機率。看似這個問題意義不大,由於你擲出來的結果不少時候都對應了一個比較大的機率。問這個問題的目的,實際上是檢測觀察到的結果和已知的模型是否吻合。若是不少次結果都對應了比較小的機率,那麼就說明咱們已知的模型頗有多是錯的,有人偷偷把咱們的骰子給換了。

 

知道骰子有幾種(隱含狀態數量),不知道每種骰子是什麼(轉換機率),觀測到不少次擲骰子的結果(可見狀態鏈),我想反推出每種骰子是什麼(轉換機率)。這個問題很重要,由於這是最多見的狀況。不少時候咱們只有可見結果,不知道HMM模型裏的參數,咱們須要從可見結果估計出這些參數,這是建模的一個必要步驟。

 

  1. 一個簡答問題

其實這個問題使用價值不高。因爲對下面較難的問題有幫助,因此在這裏先提一下。

知道骰子有幾種,每種篩子是什麼,每次擲的都是什麼骰子,給出一串數字序列,

求產生這個序列的機率。

解法無非就是機率相乘:

破解骰子序列

這裏我說的是第一種解法,解最大似然路徑問題。

舉例來講,我知道我有三個骰子,六面骰,四面骰,八面骰。我也知道我擲了十次的結果(1,6,3,5,2,7,3,5,2,4),我不知道每次用了哪一種骰子,我想知道最有可能的骰子序列。

其實最簡單而暴力的方法就是窮舉全部可能的骰子序列,而後依照第零個問題的解法把每一個序列對應的機率算出來。而後咱們從裏面把對應的最大機率的序列挑出來就好了。若是馬爾科夫鏈不長,固然可行,若是馬爾科夫鏈長的話,窮舉的數量太大,就很難完成了。

另外一種頗有名的算法叫作Viterbi algorithm,要理解這個算法,咱們先看幾個簡單的例子。

首先,若是咱們只擲一次骰子:

看到結果爲1,對應的最大機率骰子序列就是D4,由於D4產生1的機率是1/4,高於1/6和1/8。

把這個狀況拓展,咱們擲兩次骰子:

結果爲1,6.這時問題變得複雜起來,咱們要計算三個值,分別是第二個骰子是D6,D4,D8的最大機率,顯然要取得最大機率,第一個骰子必須是D4。這時,第二個骰子取到D6的最大機率是

一樣的,咱們能夠計算第二個骰子是D4或D8時的最大機率。咱們發現,第二個骰子取到D6的機率最大。而使這個機率最大時,第一個篩子爲D4。因此最大機率骰子序列就是D4D6。

繼續拓展,咱們擲三次骰子:

一樣,咱們計算第三個骰子分別是D6,D4,D8的最大機率。咱們再次發現,要取到最大機率,第二個骰子必須爲D6。這時,第三個骰子取到D4的最大機率是

同上,咱們能夠計算第三個骰子是D6或D8時的最大機率。咱們發現,第三個骰子取到D4的機率最大。而使這個機率最大時,第二個骰子爲D6,第一個骰子爲D4。因此最大機率骰子序列就是D4 D6 D4。

寫到這裏,你們應該看出點規律了,這其實就是機率DP問題(Dynamic Programming with Probability)。既然擲骰子一二三次能夠算,擲多少次均可以以此類推。咱們發現,咱們要求最大機率骰子序列時要作這麼幾件事情:

首先,無論序列多長,要從序列長度爲1算起,算序列長度爲1時取到每一個骰子的最大機率。

而後,逐漸增長長度,每增長一次長度,從新算一遍在這個長度下最後一個位置取到每一個骰子的最大機率。由於上一個長度下的取到每一個骰子的最大機率都算過了,從新計算的話其實不難。當咱們算到最後一位時,就知道最後一位是哪一個骰子的機率最大了。

最後,咱們把對應這個最大機率的序列從後往前推出來

誰動了個人骰子

好比說你懷疑本身的六面骰被賭場動過手腳了,有可能被換成另外一種六面骰,這種六面骰擲出來是1的機率更大,是1/2,擲出來是2,3,4,5,6的機率是1/10.你怎麼辦?答案很簡單,算一算正常的三個骰子擲出一段序列的機率,再算一算不正常的六面骰和另外兩個正常骰子擲出這段序列的機率。若是前者比後者小,你就要當心了。

好比說擲骰子的結果是:

要算出正常的三個骰子擲出這個結果的機率,其實就是將全部可能狀況的機率進行加和計算。一樣的,簡單而暴力的方法就是把窮舉全部的骰子序列,仍是計算每一個骰子序列對應的機率,可是這回,咱們不挑最大值了,而是把全部算出來的機率相加,獲得的總機率就是咱們要求的結果。這個方法依然不能應用於太長的骰子序列(馬爾科夫鏈)。

咱們會應用和前一個問題相似的解法,只不過前一個問題關心的是機率最大值,這個問題關心的是機率之和。解決這個問題的算法叫作前向算法(forward algorithm)。

首先,若是咱們只擲一次骰子:

看到結果爲1,產生這個結果的總機率能夠按照以下計算,總機率是0.18:

把這個狀況拓展,咱們擲兩次骰子:

看到結果爲1,6.產生這個結果的總機率能夠按照以下計算,總機率爲0.05:

一樣的,咱們一步一步的算,有多長算多長,再長的馬爾可夫鏈總能算出來的。用一樣的方法,也能夠算出不正常的六面骰和另外兩個正常骰子擲出這段序列的機率,而後咱們比較一下這兩個機率大小,就能知道你的骰子是否是被人換了。

 

原文連接:https://www.zhihu.com/question/20962240

相關文章
相關標籤/搜索