马尔科夫模型-前向算法
本博客主要编写在马尔科夫链中用到的前向算法的代码,具体理论设计请参考这个博客:也可以参考我自己的博客文章《维特比算法》,代码如下:
代码块
代码块语法遵循标准markdown代码,例如:
# -*- coding: utf-8 -*-
from collections import defaultdict
states = ("B1", "B2", "B3")
observations = ("RED", "WHITE", "RED")
start_probability = {"B1": 0.2, "B2": 0.4, "B3": 0.4}
transition_probability = {
"B1": {"B1": 0.5 , "B2": 0.2 , "B3": 0.3},
"B2": {"B1": 0.3 , "B2": 0.5 , "B3": 0.2},
"B3": {"B1": 0.2 , "B2": 0.3 , "B3": 0.5},
}
emission_probability = {
"B1": {"RED":0.5, "WHITE":0.5},
"B2": {"RED":0.4, "WHITE":0.6},
"B3": {"RED":0.7, "WHITE":0.3},
}
# 利用动态规划求解最佳路径
def compute(obs, states, start_p, trans_p, emit_p):
# 定义各个概率
v = [{} for _ in range(len(obs))]
# 设置初始概率
for state in states:
v[0][state] = start_p[state] * emit_p[state][obs[0]]
for t in range(1, len(obs)):
for state in states:
prob_part = 0
for state0 in v[t - 1]:
prob_part += v[t - 1][state0] * trans_p[state0][state] * emit_p[state][obs[t]]
v[t][state] = prob_part
# 计算总值
prob = 0
for state in states:
prob += v[len(v) - 1][state]
return prob
if __name__ == "__main__":
prob = compute(observations, states, start_probability,
transition_probability, emission_probability)
print prob
运行以后的概率值为:0.130218
本文详细介绍了如何使用前向算法解决马尔科夫模型中的问题,并通过具体的例子展示了算法的实现过程。包括状态转移概率、观测概率等关键参数的设置,以及动态规划方法来计算观测序列下最可能的状态序列。
1023

被折叠的 条评论
为什么被折叠?



