概述
隐马尔可夫模型之HMM基础
隐马尔可夫模型之评估观察序列概率
隐马尔可夫模型之学习算法
隐马尔可夫模型之预测算法
隐马尔可夫模型之python实战
手写
定义数据
Hidden_states = ("box 1", "box 2", "box 3") # 隐状态集合
Observations_states = ('red', 'white', 'red') # 观测状态集合
Start_probability = {'box 1': 0.2, 'box 2': 0.4, 'box 3': 0.4} # 初始状态
Hidden_transition_probability = { # 隐马尔可夫链中从当前盒子转移到其他盒子的概率
'box 1' : {'box 1': 0.5, 'box 2': 0.2, 'box 3': 0.3},
'box 2' : {'box 1': 0.3, 'box 2': 0.5, 'box 3': 0.2},
'box 3' : {'box 1': 0.2, 'box 2': 0.3, 'box 3': 0.5},
}
Hidden_observations_probability = { # 原来叫emission_probability。这里表示每个盒子里面红白球的数量
'box 1' : {'red': 0.5, 'white': 0.5},
'box 2' : {'red': 0.4, 'white': 0.6},
'box 3' : {'red': 0.7, 'white': 0.3},
}
定义维特比算法
def viterbi(obs, states, start_p, trans_p, h2o_p): # Viterbi算法
'''
input:
obs:观测状态集合O={红,白,红}
states:隐状态集合Q={盒子1,盒子2,盒子3}
start_p:初始状态Π=(0.2,0.4,0.4)T
trans_p:转移状态矩阵A=【0.5 0.3 0.2
0.2 0.5 0.3
0.3 0.2 0.5】
h2o_p:观测状态概率矩阵为:B=【0.5 0.4
0.7 0.5
0.6 0.3】
output:
prob:最优概率
path[state]:最优路径
'''
V = [{}]
path = {}
# Initialize base cases (t == 0)
for y in states:
#t=1时刻,状态为i观测o1为红的概率,即δ1(i)
V[0][y] = start_p[y] * h2o_p[y][obs[0]]
# 初始状态,由start的概率,对应乘上发射概率,即由隐状态到观测状态的可能性
path[y] = [y]
# 开始遍历,t=2和t=3时刻
for t in range(1,len(obs)):
V.append({})
newpath = {}
for y in states:
# 对于每个箱子,计算其由前一个的各个状态,到现在箱子的概率大小,取最大值。即求出最有可能到达现在箱子的路径
# 前一个箱子转移到现在箱子的每个状态对应的路径大小都计算了,取最大值。作为V[t][y]的值,并更新路径
(prob, state) = max([(V[t-1][y0] * trans_p[y0][y] * h2o_p[y][obs[t]], y0) for y0 in states])
V[t][y] = prob
newpath[y] = path[state] + [y]
# Don't need to remember the old paths
path = newpath
print_dptable(V)
(prob, state) = max([(V[len(obs) - 1][y], y) for y in states])
return (prob, path[state])
预测
viterbi(Observations_states,
Hidden_states,
Start_probability,
Hidden_transition_probability,
Hidden_observations_probability)
(0.014699999999999998, [‘box 3’, ‘box 3’, ‘box 3’])
调包
hmmlearn安装很简单,"pip install hmmlearn"即可完成。
hmmlearn文档
定义数据
states = ["box 1", "box 2", "box3"]
n_states = len(states)
observations = ["red", "white"]
n_observations = len(observations)
start_probability = np.array([0.2, 0.4, 0.4])
transition_probability = np.array([
[0.5, 0.2, 0.3],
[0.3, 0.5, 0.2],
[0.2, 0.3, 0.5]
])
emission_probability = np.array([
[0.5, 0.5],
[0.4, 0.6],
[0.7, 0.3]
])
建模
model = hmm.MultinomialHMM(n_components=n_states)
model.startprob_=start_probability
model.transmat_=transition_probability
model.emissionprob_=emission_probability
seen = np.array([[0,1,0]]).T
logprob, box = model.decode(seen, algorithm="viterbi")
结果
print("The ball picked:【", ", ".join(map(lambda x: observations[x[0]], seen)),"】")
print("The hidden box【", ", ".join(map(lambda x: states[x], box)),"】")
The ball picked:【 red, white, red 】
The hidden box【 box3, box3, box3 】
github
最后
以上就是碧蓝导师为你收集整理的隐马尔可夫模型之python实战的全部内容,希望文章能够帮你解决隐马尔可夫模型之python实战所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复