繼上篇貝葉斯(後,一直想完成隱馬爾科夫這篇,一是一直沒有時間完成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時...