概率图模型1:隐马尔科夫(1)
来源:互联网 发布:python exit 返回值 编辑:程序博客网 时间:2024/06/07 10:15
作者:相国大人
- 概率图模型系列博文目录实时更新点此处
- 导读
- 隐马尔科夫模型
- 两个基本假设
- 基本定义
- 隐马尔科夫模型的3个基本问题
- 概率计算问题
- 前向算法
- 后向算法
- 隐马尔科夫模型
写这篇博文用了很多时间和精力,如果这篇博文对你有帮助,希望您可以打赏给博主相国大人。哪怕只捐1毛钱,也是一种心意。通过这样的方式,也可以培养整个行业的知识产权意识。我可以和您建立更多的联系,并且在相关领域提供给您更多的资料和技术支持。
手机扫一扫,即可:
附:《春天里,我们的拉萨儿童图书馆,需要大家的帮助》
概率图模型系列博文目录(实时更新,点此处)
1. 导读
参考文献
- 《机器学习郑捷》第11章
- 机器学习周志华 14章
- 《统计学系方法》第10章
- 《概率图模型》第3章贝叶斯网表示和马尔科夫
- 《驾驭文本》
隐马尔科夫模型
两个基本假设:
齐次马尔科夫性假设:隐藏的马尔科夫链在任意时刻
t 的状态只依赖于前一时刻的状态,与其他时刻的状态及观测无关,也与时刻t 无关。观测独立性假设:任意时刻的观测只依赖于该时刻的马尔科夫链的状态,与其他观测及状态无关。
说人话,就下面这个图,其中箭头和连边表示概率依赖。
从这个图中,我们可以很轻松的对后面的一些公式做推导。比如:
上面的公式为了书写简便,我们省略掉了概率符号
基本定义:
转移概率
观测概率
初始状态概率
隐马尔科夫模型的3个基本问题
- 概率计算
- 学习问题
- 预测问题/解码问题
概率计算问题
前向算法
前向概率
转移概率
观测概率
初始状态概率
初始前向概率:
前向概率的迭代推导:
终止状态推导:
算法1.1(观测序列概率的前向算法)
输入:隐马尔科夫模型
输出:观测序列概率
根据公式
(1.8) ,设定初值。根据公式
(1.9) 递推。其中t=1,2,⋯,T−1 。终止。根据公式
(1.10) 得到输出。
python实现(李航《统计学习方法》177页例题10.2):
#!/usr/bin/env python# -*- coding: UTF-8 -*-"""@author: XiangguoSun@contact: sunxiangguodut@qq.com@file: forward_prob.py@time: 2017/3/13 8:53@software: PyCharm"""import numpy as npdef forward_prob(model, Observe, States): ''' 马尔科夫前向算法 ''' A, B, pi = model N = States.size T = Observe.size alpha = pi*B[:, Observe[0]] print "(1)计算初值alpha_1(i): ",alpha print "(2) 递推..." for t in xrange(0, T-1): print "t=", t+1," alpha_",t+1,"(i):",alpha alpha = alpha.dot(A)*B[:, Observe[t+1]] print "(3)终止。alpha_",T,"(i): ", alpha print "输出Prob: ",alpha.sum() return alpha.sum()if __name__ == '__main__': A = np.array([[0.5, 0.2, 0.3], [0.3, 0.5, 0.2], [0.2, 0.3, 0.5]]) B = np.array([[0.5, 0.5], [0.4, 0.6], [0.7, 0.3]]) pi = np.array([0.2, 0.4, 0.4]) model = (A, B, pi) Observe = np.array([0, 1, 0]) States = np.array([1, 2, 3]) forward_prob(model,Observe,States)
后向算法
后向概率:
初始后向概率:
后向概率迭代推导:
终止状态推导:
算法1.2(观测序列概率的后向算法)
输入:隐马尔科夫模型
输出:观测序列概率
- 设定后向概率初值为1。
- 根据公式
(1.11) 递推。其中t=T−1,T−2,⋯,1 。 - 终止。根据公式
(1.12) 得到输出。
python实现(李航《统计学习方法》177页例题10.2):
#!/usr/bin/env python# -*- coding: UTF-8 -*-"""@author: XiangguoSun@contact: sunxiangguodut@qq.com@file: markov.py@time: 2017/3/13 8:53@software: PyCharm"""import numpy as npdef forward_prob(model, Observe, States): ''' 马尔科夫前向算法 ''' A, B, pi = model N = States.size T = Observe.size alpha = pi*B[:, Observe[0]] print "(1)计算初值alpha_1(i): ",alpha print "(2) 递推..." for t in xrange(0, T-1): alpha = alpha.dot(A)*B[:, Observe[t+1]] print "t=", t + 1, " alpha_", t + 1, "(i):", alpha print "(3)终止。alpha_",T,"(i): ", alpha print "输出Prob: ",alpha.sum() return alpha.sum()def backward_prob(model,Observe,States): ''' 马尔科夫后向算法 ''' A, B, pi = model N = States.size T = Observe.size beta = np.ones((N,)) # beta_T print "(1)计算初值beta_",T,"(i): ", beta print "(2) 递推..." for t in xrange(T - 2, -1, -1): # t=T-2,...,0 beta = A.dot(B[:, Observe[t + 1]] * beta) print "t=", t + 1, " beta_", t + 1, "(i):", beta print "(3)终止。alpha_", 1, "(i): ", beta prob = pi.dot(beta * B[:, Observe[0]]) print "输出Prob: ", prob return probif __name__ == '__main__': A = np.array([[0.5, 0.2, 0.3], [0.3, 0.5, 0.2], [0.2, 0.3, 0.5]]) B = np.array([[0.5, 0.5], [0.4, 0.6], [0.7, 0.3]]) pi = np.array([0.2, 0.4, 0.4]) model = (A, B, pi) Observe = np.array([0, 1, 0]) States = np.array([1, 2, 3]) forward_prob(model,Observe,States) backward_prob(model, Observe, States)
实验结果:
- 概率图模型【读书笔记1】概率理论
- 概率图模型1:隐马尔科夫(1)
- 概率图模型学习(1)——基础
- 概率图模型学习(3)——马尔科夫网表示1
- 概率图模型6:条件随机场(1)
- 概率图模型2:隐马尔科夫(2)
- 概率图模型
- 概率图模型
- 概率图模型基础
- 概率图模型
- 概率图模型
- 概率图模型
- 概率图模型
- 概率图模型
- 概率图模型
- 概率图模型基础
- 概率图模型
- 概率图模型
- Github 的Trending功能,帮你轻松找到有潜力的开源项目
- 正则表达式总结
- jsp之javaBean初理解
- 重温数据结构三——LinkedList
- 获取当前应用程序所在目录
- 概率图模型1:隐马尔科夫(1)
- android studio 编译aidl以及示例demo
- 对双大括号初始化的理解
- 数字二进制位的奇偶位互换
- eclipse在程序修改后,点击运行可以自动保存,如何设置
- css清除浮动
- Android插件化架构设计之加载资源文件
- TP url重写规则及wamp配置
- 学习总结,持续更新