牛刀小试利使用Python利用维特比算法解决经典隐马尔科夫链问题

PS:折腾了半天终于将博客取回,为纪念这个历史时刻,打算将最近学习机器学习的记录同大家分享下!

以下是解决李航的《统计学习方法》中例10.2(盒子和彩球问题)的Python代码实现。Csdn对Word文档编辑的矩阵显示支持得不太好,算法思路请通过以下链接下载查看。

# -*- coding: UTF-8 -*-
"""
   维特比算法实现:解决盒子与球颜色问题
   KaiwiiHo
"""
import numpy as np

if __name__ == '__main__':
    """
    状态(盒子序号)Q:1,2,3
    观察值(球的颜色)V:红,白
    训练集产生的模型参数(A,B,π)
    """
    stateTransition = np.array([0.5,0.2,0.3,0.3,0.5,0.2,0.2,0.3,0.5]).reshape(3,3)#状态间转移概率矩阵A
    stateToObservationTransition = np.array([0.5,0.5,0.4,0.6,0.7,0.3]).reshape(3,2)#状态转移观察概率矩阵B
    startState = np.array([0.2,0.4,0.4])#状态初始化概率π
    """
       观察结果O:"red","white","red",对应序号为:0,1,0
    """
    observation = np.array([0,1,0])
    """
       迭代计算
    """
    resMaxProbability = []#记录在当前时刻出现当前观察值时,出现某状态的最大概率。
    resMaxState = []#为出现某状态的最大概率时,上一时刻的状态值。
    obs_index = 0
    for obs in observation:
        if obs_index == 0:
            #初始化状态
            curProbability = startState*stateToObservationTransition[:,observation[obs_index]]
            resMaxProbability.append(curProbability)
        else:
            previewMaxProbability = resMaxProbability[obs_index-1]
            curProbability = []
            curState = []
            for item in range(len(stateTransition)):
                temp = stateTransition[:,item]*previewMaxProbability
                curProbability.append(np.max(temp))
                curState.append(np.argmax(temp))
            curProbability = curProbability*stateToObservationTransition[:,observation[obs_index]]
            resMaxProbability.append(curProbability)
            resMaxState.append(curState)
        obs_index = obs_index + 1
    print(resMaxProbability)
    print("=================")
    print(resMaxState)
    """
    回溯
    """
    resState = []#推理所得的状态序列
    resMaxProbabilityLen = len(resMaxProbability)
    lastMaxState = np.argmax(resMaxProbability[resMaxProbabilityLen-1])
    resState.append(lastMaxState)
    curMaxProbabilityState = lastMaxState
    print(lastMaxState)
    for index in range(resMaxProbabilityLen-1):
        curMaxProbabilityState = resMaxState[resMaxProbabilityLen-2-index][curMaxProbabilityState]
        resState.append(curMaxProbabilityState)

    print("结果是:%s" % resState)



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法是一种用于马尔科模型中求解最可能的状态序列的算法。下面是Python实现维算法的示例代码: ```python import numpy as np def viterbi(obs, states, start_p, trans_p, emit_p): V = [{}] path = {} for y in states: V[0][y] = start_p[y] * emit_p[y][obs[0]] path[y] = [y] for t in range(1, len(obs)): V.append({}) newpath = {} for y in states: (prob, state) = max((V[t-1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states) V[t][y] = prob newpath[y] = path[state] + [y] path = newpath (prob, state) = max((V[len(obs) - 1][y], y) for y in states) return (prob, path[state]) # 示例 obs = [0, 1, 2] # 观测序列 states = ['健康', '发烧'] # 藏状态 start_p = {'健康': 0.6, '发烧': 0.4} # 初始概率 trans_p = {'健康': {'健康': 0.7, '发烧': 0.3}, '发烧': {'健康': 0.4, '发烧': 0.6}} # 转移概率 emit_p = {'健康': {0: 0.5, 1: 0.4, 2: 0.1}, '发烧': {0: 0.1, 1: 0.3, 2: 0.6}} # 发射概率 prob, path = viterbi(obs, states, start_p, trans_p, emit_p) print("观测序列:", obs) print("最可能的状态序列:", path) print("概率:", prob) ``` 在上面的示例代码中,我们定义了一个`viterbi`函数,它接受观测序列、藏状态、初始概率、转移概率和发射概率作为输入,并返回最可能的状态序列和对应的概率。在函数内部,我们使用了一个`V`列表来保存每个时间步骤的最大概率,使用一个`path`字典来保存每个状态的最大概率路径。在计算过程中,我们使用了动态规划的思想,通过递推计算每个时间步骤的最大概率和对应的路径。最后,我们返回最后一个时间步骤的最大概率和对应的状态路径,即为最可能的状态序列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值