隱馬爾科夫模型 HMM 淺見

2021-09-02 13:22:11 字數 4050 閱讀 8037

隱馬爾科夫模型,hidden marcov model

是可用於標註問題的統計學習模型,描述由隱藏的馬爾科夫鏈隨機生成觀測序列的過程,屬於生成模型,是一種比較重要的機器學習方法,在語音識別等領域有重要的應用。

本文不打算使用書面的一大堆公式來說明,本人對公式無感,能用例子說明的根本不想碰公式,不知道是不是霍金說過,多加一條公式就會損失一大片讀者。ps:不管有沒有說過了,是這個意思,whatever

首先說明一下基本概念,概念來自李航《統計學習方法》第十章

然後根據書中的例子,來具體說明一下hmm的三要素功能

書中的例子舉得很明白,所以現在應該也了解了隱馬爾科夫模型的三個要素了

下面通過博主skyme的博文《一文搞懂hmm》的例子對hmm做乙個**上的解釋,需要說明的是,我無意侵犯其智財權,只是覺得該文舉得例子比較好,所以就想拿過來用,畢竟自己畫圖舉例什麼的太過麻煩,博文原位址我也給出來了,算是**裡面的引用吧。

好的言歸正傳,我們來看一下hmm需要解決的基本的三個問題,仍然是使用書的內容:

結合具體的問題,來看一下這三個問題究竟是什麼。

假設我手裡有三個不同的骰子。第乙個骰子是我們平常見的骰子(稱這個骰子為d6),6個面,每個面(1,2,3,4,5,6)出現的概率是1/6。第二個骰子是個四面體(稱這個骰子為d4),每個面(1,2,3,4)出現的概率是1/4。第三個骰子有八個面(稱這個骰子為d8),每個面(1,2,3,4,5,6,7,8)出現的概率是1/8。

我們假設開始擲骰子的時候的初始概率是一樣的也就是1/3,則初始狀態是      pi=

分別對應於d6,d4,d8, 為了方便闡述,我們假設每個狀態的轉移概率都是1/3,則轉移矩陣(也就是上文提到的a矩陣)是

然後觀測結果集合是

每個狀態的觀測概率矩陣,也就是上文提到的b矩陣

到此,pi,a,b 這hmm三要素都到齊了,至於觀測序列,則根據具體的問題具體說明

現在模型已經給出了,讓我們看一下hmm的三個問題對於這個問題的具體實現

[1],概率計算問題:我們已知上面的hmm模型引數,也知道現在的觀測序列,現在我們想知道從原始模型到這個觀測序列的概率是多少。

現在我們假設現在的觀測序列是 1-6-3

我現在想知道從之前的模型引數值(pi,a,b)擲骰子到1-6-3的概率有多大

解決辦法:

如果使用最原始的首先列舉出每個可能的狀態集然後分別求概率,然後把這些概率想加,這種辦法的效率太低,因此需要使用一種更加好的演算法來計算

這裡使用的是前向演算法,計算理論推導在書中有詳細的過程,這裡使用舉得例子

需要說明的是原文的計算結果似乎是有錯誤,所以這裡講原文的求和資料省去了,但是方法還是一樣計算,這下應該是很明了的的計算方法,就像一條計算鏈條,多長的結果都能計算出來,下面是**實現過程:

package com.luchi.hmm;

import com.luchi.hmm.problem1.status;

/* * @description

* 隱馬爾科夫模型主要解決的是三個問題

* 1,**問題,也就是解碼問題,已知模型lambda=(a,b,pi)和觀測序列,其給定觀測序列條件概率p(i|o)最大的狀態序列i

* 2,概率計算問題:給定模型lambda=(a,b,pi)和觀測序列o,計算在該模型lambda下觀測序列o出現的概率p(o|lambda)

* 3,學習問題,已知觀測序列o,估計模型lambda=(a,b,pi)的引數

* * 這裡解決的是第二個問題,也就是計算概率問題,這裡使用了前向演算法

* @author:luchi

*/public class problem2 ,

, ,

}; //狀態名稱

enum status;

//總狀態數

int status_length=3;

//擲骰子事件分別是1,2,3,4,5,6

//每個狀態下擲骰子事件發生概率

double emission_probability = new double,,};

int activity_length=emission_probability[0].length;

//觀察序列為

int observation=new int;

//初始序列

doublestart=new double;

//計算出現的概率

public void calcuprob(),

, ,

}; //狀態名稱

enum status;

//總狀態數

int status_length=3;

//擲骰子事件分別是1,2,3,4,5,6

//每個狀態下擲骰子事件發生概率

double emission_probability = new double,,};

int activity_length=emission_probability[0].length;

//觀察序列為

int observation=new int;

//初始序列

doublestart=new double;

//維特比演算法求解

public void viterbi()

}midstore[i][j]=maxprob;

traceback[i][j]=tracestatus;}}

//比較最後乙個階段的最大概率

int max_end_status=0;

double max_end_prob=-1;

for(int end_status=0;end_statusmax_end_prob)

}//回溯輸出最大概率狀態模型

int path=new int[observation.length];

path[observation.length-1]=max_end_status;

int curstatus=max_end_status;

for(int i=observation.length-1;i>=1;i--)

for(int i=0;i**的結果是:d4 d6 d4 d6 d4 d8 d4 d6 d4 d4

恩,這就是我對hidden morcov model的淺見,不足之處還望指正

參考文獻:

李航 《統計學習方法》

skyme 《一文搞懂hmm》 

隱馬爾科夫模型 HMM 淺見

隱馬爾科夫模型,hidden marcov model,是可用於標註問題的統計學習模型,描述由隱藏的馬爾科夫鏈隨機生成觀測序列的過程,屬於生成模型,是一種比較重要的機器學習方法,在語音識別等領域有重要的應用。本文不打算使用書面的一大堆公式來說明,本人對公式無感,能用例子說明的根本不想碰公式,不知道是...

隱馬爾科夫模型HMM

我們通常都習慣尋找乙個事物在一段時間裡的變化規律。在很多領域我們都希望找到這個規律,比如計算機中的指令順序,句子中的詞順序和語音中的詞順序等等。乙個最適用的例子就是天氣的 首先,本文會介紹聲稱概率模式的系統,用來 天氣的變化 然後,我們會分析這樣乙個系統,我們希望 的狀態是隱藏在表象之後的,並不是我...

隱馬爾科夫 HMM 模型

隱馬爾科夫 hidden markov model 模型是一類基於概率統計的模型,是一種結構最簡單的動態貝葉斯網,是一種重要的有向圖模型。自上世紀80年代發展起來,在時序資料建模,例如 語音識別 文字識別 自然語言處理等領域廣泛應用。隱馬爾科夫模型涉及的變數 引數眾多,應用也很廣泛,以至於很多人不明...