python做马尔科夫模型预测法_隐马尔可夫模型的前向算法和后向算法理解与实现(Python)...
前言
隐马尔可夫模型(HMM)是可用于标注问题的统计学习模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型。
马尔可夫模型理论与分析
参考《统计学习方法》这本书,书上已经讲得很详细,本文只是想详细分析一下前向算法和后向算法,加深对算法的理解,并希望能帮助到他人。
前向算法理论分析
定义
前向算法的定义.PNG
定义解析:由于每个状态生成一个观测变量,那么在t时刻就会生成t个观测变量,在t时刻处于状态i的概率就是前向概率。
前向算法
算法1.PNG
算法2.PNG
在分析算法之前,先介绍一下隐马尔可夫模型的两个基本假设,后面分析算法会用到这两个假设。
两个基本假设.PNG
下面就简要分析一下前向算法各个步骤表示的意思,只有理解了算法各步骤的意思才能写出代码。
算法的目的:根据初始参数和观测序列求出观测序列概率
步骤(1)初始值:
首先我们假设i = 1的情况,后面的解析依旧采用这样的方法,先假设一种状态,再推广到全部的状态。假设i = 1,则右边表达式的意思依次是,t = 1时刻处于状态1的概率 * 观测变量1的概率 = t = 1时刻状态1生成观测变量1的概率。推广到i = 1,2,3,...,N则整个表达式的意思是:t = 1时刻1~N个状态分别生成观测变量1的概率。
步骤(2)递推:
这里表达式很复杂,分析表达式的意思时,可以先从最里面的求和开始分析,再分析外面的,由内而外的分析思路比较清晰。既然从最里面的求和表达式分析,那么假设t和i不变j = 1时的情况。
当j = 1则公式(10.16)表达式依次表示的意思是,t时刻状态1生成观测变量1的概率 * 状态1到状态i的转移概率 * t + 1时刻状态i下生成观测变量t + 1的概率 = t时刻的状态1转移到t + 1时刻状态i生成观测变量t+1的概率。这里用到了基本假设1,计算t + 1时刻的观测变量概率只依赖于t时刻的状态,与其他状态无关。那么当j = 1,2,3,4,...,N求和时,右边表达式表示意思:t时刻的状态转移到t+1时刻状态i生成观测变量t + 1的概率。
如果想要求出在t时刻的状态转移到t + 1时刻N个状态生成观测变量t+1的概率。那么式子(10.16)处于对i = 1,2,3,...,N的循环下。
如果想要求出在T时刻状态i = 1,2,3,4,...,N分别生成观测变量T的概率,那么式子(10.16)最外面再套一个循环t = 1,2,3,....,T - 1。
步骤(3)终止:
T时刻对N个状态生成观测变量T的概率求和,表示T时刻观测变量T的概率。
前向算法代码
#隐马尔科链模型前向算法
def hmm_forward(A, PI, B, O):
M = shape(PI)[0] #观测序列大小
N = shape(A)[1] #状态序列大小
T = M
alpha = mat(zeros((M, N)))
P = 0.0
for i in range(N):
alpha[0, i] = PI[i, 0] * B[i, 0]
for t in range(T - 1):
for i in range(N):
temp_value = 0.0;
for j in range(N):
temp_value += alpha[t, j] * A[j, i]
index = 0
if(O[t + 1, 0] == 0):
index = 0
else:
index = 1
alpha[t + 1, i] = temp_value * B[i, index]
for i in range(N):
P += alpha[T - 1, i]
return P,alpha
只要对照我的前向算法分析就能看懂代码,并且知道我为什么会那样写。
后向算法理论分析
定义
后向算法定义.PNG
这个定义比较好懂,就不解析了。
后向算法
算法3.PNG
后向算法就不详细分析了,按照我分析前向算法的思路取分析就可清楚的理解每一个步骤代表的意思。
后向算法代码
#隐马尔科链模型后向算法
def hmm_backword(A, PI, B, O):
T,N = shape(A)
beta = mat(zeros((T, N)))
P = 0.0
beta[T - 1, :] = 1
t = T - 2
while t >= 0:
for i in range(N):
temp_value = 0.0
for j in range(N):
index = 0
if(O[t + 1, 0] == 0):
index = 0
else:
index = 1
temp_value += A[i, j] * B[j, index] * beta[t + 1, j]
beta[t, i] = temp_value
t -= 1
for i in range(N):
index = 0
if(O[0, 0] == 0):
index = 0
else:
index = 1
P += PI[i, 0] * B[i, index] * beta[0, i]
return P,beta
完整代码如下
from numpy import *
import numpy as np
import matplotlib as plt
import math
#隐马尔科链模型前向算法
def hmm_forward(A, PI, B, O):
M = shape(PI)[0] #观测序列大小
N = shape(A)[1] #状态序列大小
T = M
alpha = mat(zeros((M, N)))
P = 0.0
for i in range(N):
alpha[0, i] = PI[i, 0] * B[i, 0]
for t in range(T - 1):
for i in range(N):
temp_value = 0.0;
for j in range(N):
temp_value += alpha[t, j] * A[j, i]
index = 0
if(O[t + 1, 0] == 0):
index = 0
else:
index = 1
alpha[t + 1, i] = temp_value * B[i, index]
for i in range(N):
P += alpha[T - 1, i]
return P,alpha
#隐马尔科链模型后向算法
def hmm_backword(A, PI, B, O):
T,N = shape(A)
beta = mat(zeros((T, N)))
P = 0.0
beta[T - 1, :] = 1
t = T - 2
while t >= 0:
for i in range(N):
temp_value = 0.0
for j in range(N):
index = 0
if(O[t + 1, 0] == 0):
index = 0
else:
index = 1
temp_value += A[i, j] * B[j, index] * beta[t + 1, j]
beta[t, i] = temp_value
t -= 1
for i in range(N):
index = 0
if(O[0, 0] == 0):
index = 0
else:
index = 1
P += PI[i, 0] * B[i, index] * beta[0, i]
return P,beta
if __name__ == "__main__":
A = mat([[0.5, 0.2, 0.3],
[0.3, 0.5, 0.2],
[0.2, 0.3, 0.5]])
B = mat([[0.5, 0.5],
[0.4, 0.6],
[0.7, 0.3]])
PI = mat([[0.2],
[0.4],
[0.4]])
#红,白,红
O = mat([[0],
[1],
[0]])
P,alpha = hmm_forward(A, PI, B, O)
print(P)
print("--------------------------------------")
P,beta = hmm_backword(A, PI, B, O)
print(P)
输入数据
和《统计学习方法》这本书上的输入数据一样
A = mat([[0.5, 0.2, 0.3],
[0.3, 0.5, 0.2],
[0.2, 0.3, 0.5]])
B = mat([[0.5, 0.5],
[0.4, 0.6],
[0.7, 0.3]])
PI = mat([[0.2],
[0.4],
[0.4]])
O = mat([[0],
[1],
[0]])
输入数据.PNG
输出结果
本问前向算法和后向算法的输出结果
输出结果.PNG
《统计学习方法》这本书上的输出结果
书上的输出结果.PNG
结果分析
由以上输出结果可知,本文的输出结果与书上的输出结果一致,且前向算法和后向算法的输出结果也一致,则本文的前向算法与后向算法完全正确。
python做马尔科夫模型预测法_隐马尔可夫模型的前向算法和后向算法理解与实现(Python)...相关推荐
- python做马尔科夫模型预测法_李航《统计学习方法》第十章——用Python实现隐马尔科夫模型...
相关文章: 李航<统计学习方法>第二章--用Python实现感知器模型(MNIST数据集) 李航<统计学习方法>第三章--用Python实现KNN算法(MNIST数据集) 李航 ...
- python做马尔科夫模型预测法_通过Python的Networkx和Sklearn来介绍隐性马尔科夫模型...
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 文章梗概 马尔科夫是何人? 马尔科夫性质是什么? 马尔科夫模型是什么? 是什么让马尔科夫模型成为隐性的? ...
- python做马尔科夫模型预测法_用Python实现马尔可夫链蒙特卡罗
摘要: 本文通过用Python中的马尔可夫链蒙特卡罗实现了睡眠模型项目,并教会如何使用MCMC. 在过去的几个月里,我在数据科学领域里遇到一个术语:马尔可夫链蒙特卡罗(MCMC).在博客或文章里,每次 ...
- c++求解自行车慢速比赛问题_隐马尔可夫模型(模型推断五大问题)
1.隐马尔科夫模型Learning问题是求解未知参数λ 2.隐马尔科夫模型Inference问题有五个:Decoding.Evaluation.Filtering.Smoothing.Predicti ...
- HMM模型:马尔可夫链、隐马尔可夫模型
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 4.1 马尔科夫链 在机器学习算法中,马尔可夫链(Markov ...
- hmm 求隐藏序列_隐马尔可夫模型HMM
以下内容来自刘建平Pinard-博客园的学习笔记,总结如下: 1 隐马尔可夫模型HMM 隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别 ...
- KS值是衡量分类模型预测准确度的重要指标之一,它反映了模型预测结果与实际数据分布差异的程度。本文将介绍什么是KS值,如何计算以及在Python中如何实现。
KS值是衡量分类模型预测准确度的重要指标之一,它反映了模型预测结果与实际数据分布差异的程度.本文将介绍什么是KS值,如何计算以及在Python中如何实现. KS值定义 KS值又称为"Kolm ...
- R语言基于自定义函数构建xgboost模型并使用LIME解释器进行模型预测结果解释:基于训练数据以及模型构建LIME解释器解释一个iris数据样本的预测结果、LIME解释器进行模型预测结果解释并可视化
R语言基于自定义函数构建xgboost模型并使用LIME解释器进行模型预测结果解释:基于训练数据以及模型构建LIME解释器解释一个iris数据样本的预测结果.LIME解释器进行模型预测结果解释并可视化 ...
- R语言基于自定义函数构建xgboost模型并使用LIME解释器进行模型预测结果解释:基于训练数据以及模型构建LIME解释器解释多个iris数据样本的预测结果、使用LIME解释器进行模型预测结果解释
R语言基于自定义函数构建xgboost模型并使用LIME解释器进行模型预测结果解释:基于训练数据以及模型构建LIME解释器解释多个iris数据样本的预测结果.使用LIME解释器进行模型预测结果解释并可 ...
最新文章
- 2018-3-31 ELM极限学习机--笔记(黄广斌PPT,以及极限学习机原理介绍的部分,但是忘记网址了)
- 全新开源,《Pytorch常用函数函数手册》开放下载!内含200余个函数!
- SAP QM Multiple Specifications的使用II
- Objective-C:GCC+GNUstep配置
- 数组方法大全ES5+ES6
- bson json c语言,对比平台--JSON和BSON之间的区别
- ROS与Android的通信
- most recent call last 报错_视频|救援情景剧、创意快闪……400w+人次为重庆这场消防宣传活动打call...
- java中return的作用
- select函数返回值_Vue学习笔记之函数、高阶函数、v-model的应用
- win7下的ipython没有的问题
- 人工智能大数据时代下的工程伦理问题探讨
- curl安装的docker卸载
- 利用SPSS做数据分析①(了解SPSS)
- Sketch 52 破解版 最佳Mac产品原型设计工具
- 敏捷开发Sprint周期总结
- 跨境电商必看:amazon账号关联因素
- 灵活用工十大热门行业及应用场景
- Mac命令行 显示隐藏文件夹 不显示隐藏文件夹
- 交换机vtp功能配置