隱馬爾科夫模型,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年代發展起來,在時序資料建模,例如 語音識別 文字識別 自然語言處理等領域廣泛應用。隱馬爾科夫模型涉及的變數 引數眾多,應用也很廣泛,以至於很多人不明...