HMM(隱馬爾科夫模型)之 Viterbi 演算法

2022-05-22 11:36:08 字數 2880 閱讀 3742

hmm(隱馬爾科夫模型)有

兩類變數:(變數序列)

1. hidden states:xi

2. events:ei

模型的三要素:

三種求解問題:

1. 已知 模型三要素 和 events,求hidden states:viterbi演算法

2. 已知 模型三要素 和 events,求這一系列events發生的概率:forward/backward 演算法

3. 已知 events,求 模型三要素: baum-welch演算法 (也可以叫forward-backward 演算法)

(注意:這裡baum-welch演算法也可以叫forward-backward 演算法,是因為它本質上是從forward和backward兩個方向進行的。而forward/backward 演算法這裡為「或」,是因為只要其中乙個方向就能求解出來了)

(另:三種演算法間有著緊密的聯絡)

以下為我個人對三種演算法的理解:

viterbi演算法 和 forward/backward 演算法都是 動態規劃 的一種特例

baum-welch演算法 是 em演算法 的一種特例(迭代的方法估計引數基本都是em演算法)

簡單了解viterbi演算法的思想可以看:

在乙個hmm模型的例子中來講解可以看:

用公式來表達viterbi演算法非常簡潔:

其中m,c作為中間變數,其意義為:

m(i, j):第 i 個狀態時是第 j 個hidden state 的概率

c(i, j): 第 i 個狀態時第 j 個hidden state 對應的上乙個狀態概率最大的 hidden state(因此 i 是取不到0的)

最後的x(i)即為events 對應的 hidden states 序列

時間複雜度分析:

該演算法本質上來說是動態規劃,其中取max相當於剪枝的效果,這樣時間複雜度從暴力列舉的 n^t 縮小到 t * n^2

**如下:

def

viterbi(prior, transprob, emisprob, events):

'''prior: [numhidden]

transprob: [numhidden(last), numhidden(current)]

emisprob: [numhidden, numevents]

events: [lengthevents] # index of events should start from 0

'''numhidden =emisprob.shape[0]

numevents = emisprob.shape[1]

lengthevents =events.shape[0]

hiddenprob =np.zeros((lengthevents, numhidden))

record = np.zeros((lengthevents, numhidden), dtype=np.int) #

record[0, :] is not been used

assert prior.shape[0] ==numhidden

assert transprob.shape[0] ==numhidden

assert transprob.shape[1] ==numhidden

bestroute = np.zeros(lengthevents, dtype=np.int)

#calculate the first state

for i in

range(numhidden):

hiddenprob[0, i] = prior[i] *emisprob[i, events[0]]

#calculate other states

for i in range(1, lengthevents): #

event index

for j in range(numhidden): #

current state

temp =np.zeros(numevents)

for k in range(numhidden): #

last state

temp[k] = hiddenprob[i-1, k] *transprob[k, j]

hiddenprob[i, j] = np.max(temp) *emisprob[j, events[i]]

record[i, j] =np.argmax(temp)

#find the best route

bestroute[-1] = np.argmax(hiddenprob[-1, :])

for i in range(lengthevents - 2, -1, -1):

bestroute[i] = record[i+1, bestroute[i+1]]

return bestroute

(其實就是把上面公式翻譯了一遍)

關於其他兩個演算法:

forward/backward比較簡單

baum–welch演算法可參考:

參考:

隱馬爾科夫模型HMM

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

隱馬爾科夫 HMM 模型

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

HMM隱馬爾科夫模型

問題 講講hmm隱馬爾科夫模型 1 隱馬爾科夫模型是關於時序的概率模型,是由乙個隱藏的馬爾科夫鏈隨機生成不可觀測的隨機狀態序列,並由各個狀態生成乙個觀測而產生觀測隨機序列的過程。統計學習方法 cha10 概念解釋 馬爾可夫鏈 一階馬爾可夫過程,即未來狀態僅與當前狀態有關,與過去無關。馬爾可夫過程 狀...