
用numpy实现隐马尔科夫模型的概率计算问题(前向算法)
发布日期:2021-05-04 18:12:40
浏览次数:30
分类:原创文章
本文共 2139 字,大约阅读时间需要 7 分钟。
实现用例为李航统计学习方法第177页例10.2
import numpy as np''' 用numpy实现隐马尔科夫模型的概率计算,即已知三元模型λ=(A,B,π)和观测序列O,计算在模型λ下观测序列O出现的概率P(O|λ)''''''一,定义模型的三要素''''''状态的集合'''def status_gener(status_len:int): status_list = [] for status_index in range(status_len): status_list.append(status_len) return status_list'''观测的集合'''obs_list = np.array(["红", "白", "红"])'''时刻数'''T = 3'''初始取哪个盒子的概率分布'''init_prob_dist = np.array([0.2,0.4,0.4]) '''状态转移概率分布'''state_tran_prob = np.array([[0.5, 0.2, 0.3], [0.3, 0.5, 0.2], [0.2, 0.3, 0.5]])'''观测概率分布'''obs_prob_dist = np.array([[0.5, 0.5], [0.4, 0.6], [0.7, 0.3]])'''二,利用前向算法计算''''''初值计算'''def init_value_calcu(obs_list, obs_prob_dist, init_prob_dist): # 3个形参分别为观测序列、观测概率分布、初始状态概率分布 if obs_list[0] == "红": obs_prob_dist_col = obs_prob_dist[:,0] # 取出每一时刻取出某个盒子后拿出红球的概率 elif obs_list[0] == "白": obs_prob_dist_col = obs_prob_dist[:,1] # 取出每一时刻取出某个盒子后拿出白球的概率 init_value = init_prob_dist * obs_prob_dist_col # 初始取哪个盒子的概率分布*每一时刻取出某个盒子后拿出白或红球的概率 return init_value'''递推计算'''def recur_calcu(obs_list, state_tran_prob): # print(len(state_tran_prob)) init_state_value = init_value_calcu(obs_list, obs_prob_dist, init_prob_dist) # print(init_state_value) a = 0 time_num = len(state_tran_prob) for obs_id in obs_list[1:]: state = np.array([]) for time_num_id in range(time_num): if a < 1: prob_value = np.cumsum(init_state_value * state_tran_prob[:, time_num_id], axis=0)[-1] state = np.append(state, prob_value) else: prob_value = np.cumsum(state_value * state_tran_prob[:, time_num_id], axis=0)[-1] state = np.append(state, prob_value) if obs_id == "红": state_value = state * obs_prob_dist[:, 0] elif obs_id == "白": state_value = state * obs_prob_dist[:, 1] a += 1 final_value = np.cumsum(state_value, axis=0)[-1] return final_value if __name__ == "__main__": print(recur_calcu(obs_list, state_tran_prob))
Done!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月05日 13时02分58秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MATLAB在线编辑网站及使用教程
2019-03-04
IOC容器_Bean管理xml方式
2019-03-04
python+Aritest自动化—02—app_util.py—app驱动
2019-03-04
Typora的基础用法
2019-03-04
蓝桥杯入门练习题斐波那契数列
2019-03-04
Linux-find
2019-03-04
动态规划-矩阵连乘
2019-03-04
匿名内部类
2019-03-04
后台守护线程
2019-03-04
volatile关键字
2019-03-04
(JAVA常用类库)CharSequence接口
2019-03-04
(Java基础类库 )System类
2019-03-04
context:include-filter与exclude-filte控制扫描组件
2019-03-04
Two Day今日程序学习记录->关于指针的一点问题以及16进制转10进制
2019-03-04
《Java---------java环境搭建》
2019-03-04
【SSL】1203书的复制(normal)
2019-03-04
【SSL】1072砝码称重
2019-03-04
【SSL】2294打包
2019-03-04
标程_高精度运算
2019-03-04
【SSL】1033&【洛谷】P1040加分二叉树
2019-03-04