隱馬爾科夫 維特比演算法

2022-02-07 12:29:33 字數 3274 閱讀 9889

繼上篇貝葉斯(後,一直想完成隱馬爾科夫這篇,一是一直沒有時間完成python的示例實現**,二是想找乙個區別於天氣的隱馬爾科夫例子。區別於貝葉斯,隱馬爾科夫模型是基於時序的概率模型,本文只關注於一階隱馬爾科夫模型,即某一時刻的狀態值只跟上一時刻的狀態值有關。該模型可以用三元組表示:λ = (a, b,π ), 其中:

舉乙個例子來說明。

維特比演算法

假設一天中觀察到玩具狗的行為序列為, 求最可能的情緒狀態序列是什麼。這是典型的隱馬爾科夫解碼問題,下面使用維特比演算法求解。

self.a = a # 轉移概率矩陣

self.b = b # 混淆概率矩陣

self.pi = pi # 初始概率矩陣

self.n = len(pi) # 隱狀態數量

self.m = len(b) / self.n # 觀察狀態數量

self.osetval = oset

self.qsetval = qset

self.qset =

self.oset =

for i in range(0, self.n):

for i in range(0, self.m):

def dump(self):

stra = "a:"

i = 0

for k in self.a:

if i % self.n == 0:

stra = stra + "\n"

stra = stra + " " + str(k)

i = i + 1

print(stra)

i = 0

strb = "b:"

for k in self.b:

if i % self.m == 0:

strb = strb + "\n"

strb = strb + " " + str(k)

i = i + 1

print(strb)

print("pi:", self.pi, "n:", self.n, "m:", self.m)

def get_a(self, i, j):

return self.a[i*self.n + j]

def get_b(self, o, i):

return self.b[i*self.m + o]

def get_delta(self, delta_set, t, i):

return delta_set[t*self.n + i]

def convertostate(self, ostateset_val):

dest =

for k in ostateset_val:

for i in range(0, self.m):

if k == self.osetval[i]:

return dest

def decode(self, ostateset_val):

ostateset = self.convertostate(ostateset_val)

t = len(ostateset)

# 初始化t= 1 的情況

delta_set =

fai_set =

for i in self.qset:

delta_1_i = self.pi[i] * self.get_b(ostateset[0], i)

# 遞推求的delta 和fai

for t in range(1, t):

for i in self.qset:

fai_t_i = 0

tmp_fai_i = 0

tmp_delta = 0

for j in self.qset:

#compute fai

tmp = self.get_delta(delta_set, t - 1, j) * self.get_a(j, i)

if tmp > tmp_fai_i:

tmp_fai_i = tmp

fai_t_i = j

#compute delta

tmp = tmp * self.get_b(ostateset[t], i)

if tmp > tmp_delta:

tmp_delta = tmp

#select last i

tmp_rate_i_t = 0

i_t = 0

for i in self.qset:

tmp = self.get_delta(delta_set, t-1, i)

if tmp > tmp_rate_i_t:

tmp_rate_i_t = tmp

i_t = i

i_dest =

for tmp_t in range(1, t):

t = t - tmp_t

dest =

for n in range(0, t):

return dest

oset = ['w', 'r', 's']

qset = ['b','h', 'a']

o = ['w', 'r', 's', 'r', 's']

a = [0.5, 0.2, 0.3, 0.3, 0.5, 0.2, 0.2, 0.3, 0.5]

b = [0.5, 0.2, 0.3, 0.4, 0.1, 0.5, 0.7, 0.1, 0.2]

pi = [0.2, 0.4, 0.4]

o = yieldmrkf_t(a, b, pi, oset, qset)

o.dump()

dest = o.decode(o)

print("output:", dest

a:0.5 0.2 0.3

0.3 0.5 0.2

0.2 0.3 0.5

b:0.5 0.2 0.3

0.4 0.1 0.5

0.7 0.1 0.2

('pi:', [0.2, 0.4, 0.4], 'n:', 3, 'm:', 3)

('output:', ['a', 'h', 'h', 'h', 'h'])

隱馬爾科夫 維特比演算法

繼上篇貝葉斯 後,一直想完成隱馬爾科夫這篇,一是一直沒有時間完成python的示例實現 二是想找乙個區別於天氣的隱馬爾科夫例子。區別於貝葉斯,隱馬爾科夫模型是基於時序的概率模型,本文只關注於一階隱馬爾科夫模型,即某一時刻的狀態值只跟上一時刻的狀態值有關。該模型可以用三元組表示 a,b,其中 舉乙個例...

馬爾科夫模型與隱馬爾科夫模型

隨機過程 是隨時間而隨機變化的過程。又稱為隨機函式。馬爾科夫模型 vmm 它描述了一類重要的隨機過程。乙個系統有有限個狀態集s 隨時間推移,該系統將同某一狀態轉移到另一狀態。q s1,s2,sn 為一隨機變數序列,隨機變數取值為狀態集s中的乙個狀態,設時間t時狀態為qt。對系統的描述通常是給出當前時...

隱馬爾科夫模型

隱馬爾科夫 hiddenmarkov model 簡稱為hmm,hmm資料相當豐富,推薦參見 hmm學習最佳範例與崔曉源的部落格 一文,本文只對hmm進行簡要介紹,然後說明開源ghmm實現在linux環境的搭建,hmm的開源實現有眾多不同語言的實現。馬爾科夫模型 一階馬爾科夫模型假設為 1 t l時...