前项算法

本文详细介绍了如何使用前向算法解决马尔科夫模型中的问题,并通过具体的例子展示了算法的实现过程。包括状态转移概率、观测概率等关键参数的设置,以及动态规划方法来计算观测序列下最可能的状态序列。

马尔科夫模型-前向算法

本博客主要编写在马尔科夫链中用到的前向算法的代码,具体理论设计请参考这个博客:也可以参考我自己的博客文章《维特比算法》,代码如下:

代码块

代码块语法遵循标准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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值