相信经过上几节的说明,大家对于HMM应该有比较好的了解,也许大家已经自己试着运行代码了。
这一节主要介绍下另一个著名的HMM的Python库——hmmlearn,这个库提供了三个HMM模型(高斯HMM、离散HMM及高斯混合HMM),比我的代码速度更快,而且更有稳定,而且其还提供了相应的教程和API函数说明:http://hmmlearn.readthedocs.io/en/latest/index.html
而本文提供的代码更为简单,比较适合初学者学习参考,但不适合实际应用,实际应用可以使用hmmlearn。
为了考察本文代码的准确性,本节选择hmmlearn作为参考组,利用python测试工具unnitest,来考察代码的正确性。大体思路是先利用hmmlearn初始化一个具体HMM模型作为参照组,并生成一段序列,再将该序列作为本文HMM模型的训练样本,最后比较同参照组的参数差别。

1、python测试工具unnitest

测试工具unnitest非常容易使用,首先是建立一个继承自TestCase的测试类,然后通过覆盖setUp()完成相关初始化,最后通过覆盖tearDown()方法清除测试中产生的数据,为以后的TestCase留下一个干净的环境。我们需要在测试类中编写以test_开头的测试函数,unnitest会在测试中自动执行以test_开头的测试函数,unnitest的使用框架:

import unittest  class XXXXX(unittest.TestCase):  def setUp(self):  # 自行编写passif __name__ == '__main__':  unittest.main() 

参考文献:
https://docs.python.org/2/library/unittest.html

对离散HMM模型的测试代码

# 计算平方误差
def s_error(A, B):return sqrt(np.sum((A-B)*(A-B)))/np.sum(B)class DiscreteHMM_Test(unittest.TestCase):def setUp(self):# 建立两个HMM,隐藏状态个数为4,X可能分布为10类n_state =4n_feature = 10X_length = 1000n_batch = 100 # 批量数目self.n_batch = n_batchself.X_length = X_lengthself.test_hmm = hmm.DiscreteHMM(n_state, n_feature)self.comp_hmm = ContrastHMM(n_state, n_feature)self.X, self.Z = self.comp_hmm.module.sample(self.X_length*10)self.test_hmm.train(self.X, self.Z)def test_train_batch(self):X = []Z = []for b in range(self.n_batch):b_X, b_Z = self.comp_hmm.module.sample(self.X_length)X.append(b_X)Z.append(b_Z)batch_hmm = hmm.DiscreteHMM(self.test_hmm.n_state, self.test_hmm.x_num)batch_hmm.train_batch(X, Z)# 判断概率参数是否接近# 初始概率判定没有通过!!!self.assertAlmostEqual(s_error(batch_hmm.start_prob, self.comp_hmm.module.startprob_), 0, 1)self.assertAlmostEqual(s_error(batch_hmm.transmat_prob, self.comp_hmm.module.transmat_), 0, 1)self.assertAlmostEqual(s_error(batch_hmm.emission_prob, self.comp_hmm.module.emissionprob_), 0, 1)def test_train(self):# 判断概率参数是否接近# 单批量的初始概率一定是不准的# self.assertAlmostEqual(s_error(self.test_hmm.start_prob, self.comp_hmm.module.startprob_), 0, 1)self.assertAlmostEqual(s_error(self.test_hmm.transmat_prob, self.comp_hmm.module.transmat_), 0, 1)self.assertAlmostEqual(s_error(self.test_hmm.emission_prob, self.comp_hmm.module.emissionprob_), 0, 1)def test_X_prob(self):X,_ = self.comp_hmm.module.sample(self.X_length)prob_test = self.test_hmm.X_prob(X)prob_comp = self.comp_hmm.module.score(X)self.assertAlmostEqual(s_error(prob_test, prob_comp), 0, 1)def test_predict(self):X, _ = self.comp_hmm.module.sample(self.X_length)prob_next = self.test_hmm.predict(X,np.random.randint(0,self.test_hmm.x_num-1))self.assertEqual(prob_next.shape,(self.test_hmm.n_state,))def test_decode(self):X,_ = self.comp_hmm.module.sample(self.X_length)test_decode = self.test_hmm.decode(X)_, comp_decode = self.comp_hmm.module.decode(X)self.assertAlmostEqual(s_error(test_decode, comp_decode), 0, 1)if __name__ == '__main__':unittest.main()

2、hmmlearn产生HMM模型

利用hmmlearn初始化一个高斯HMM模型

class ContrastHMM():def __init__(self, n_state, n_feature):self.module = hmmlearn.hmm.GaussianHMM(n_components=n_state,covariance_type="full")# 初始概率self.module.startprob_ = np.random.random(n_state)self.module.startprob_ = self.module.startprob_ / np.sum(self.module.startprob_)# 转换概率self.module.transmat_ = np.random.random((n_state,n_state))self.module.transmat_ = self.module.transmat_ / np.repeat(np.sum(self.module.transmat_, 1),n_state).reshape((n_state,n_state))# 高斯发射概率self.module.means_ = np.random.random(size=(n_state,n_feature))*10self.module.covars_ = .5 * np.tile(np.identity(n_feature), (n_state, 1, 1))

利用hmmlearn初始化一个离散HMM模型

class ContrastHMM():def __init__(self, n_state, n_feature):self.module = hmmlearn.hmm.MultinomialHMM(n_components=n_state)# 初始概率self.module.startprob_ = np.random.random(n_state)self.module.startprob_ = self.module.startprob_ / np.sum(self.module.startprob_)# print self.module.startprob_# 转换概率self.module.transmat_ = np.random.random((n_state,n_state))self.module.transmat_ = self.module.transmat_ / np.repeat(np.sum(self.module.transmat_, 1),n_state).reshape((n_state,n_state))# print self.module.transmat_# 发射概率self.module.emissionprob_ = np.random.random(size=(n_state,n_feature))self.module.emissionprob_ = self.module.emissionprob_ / np.repeat(np.sum(self.module.emissionprob_, 1),n_feature).reshape((n_state,n_feature))# print self.module.emissionprob_

PS:

项目说明:http://blog.csdn.net/tostq/article/details/70846702

代码下载:https://github.com/tostq/Easy_HMM (点星是对作者最好的支持!!!^_^)

【深度剖析HMM(附Python代码)】4.HMM代码测试及hmmlearn介绍相关推荐

  1. python直线拟合_RANSAC算法详解(附Python拟合直线模型代码)

    之前只是简单了解RANSAC模型,知道它是干什么的.然后今天有个课程设计的报告,上去讲了一下RANSAC,感觉这个东西也没那么复杂,所以今天就总结一些RASAC并用Python实现一下直线拟合. RA ...

  2. TSP问题解析篇之自适应大邻域搜索(ALNS)算法深度通读(附python代码)

    01 概念科普篇 关于neighborhood serach,这里有好多种衍生和变种出来的胡里花俏的算法.大家在上网搜索的过程中可能看到什么Large Neighborhood Serach,也可能看 ...

  3. OpenCV项目开发实战--对图像种的对象进行无缝克隆-附Python、C++的代码实现

    文末附基于Python和C++两种方式实现的测试代码下载链接 图 1:无缝克隆示例:一架飞机被克隆到傍晚天空的图片中. OpenCV 3 中引入的令人兴奋的新功能之一称为无缝克隆.有了这个新功能,您可 ...

  4. 【数据可视化应用】IDW插值计算实战案例(附Python和R语言代码)

    Python版本 IDW简介 反距离权重 (IDW) 插值假设:彼此距离较近的事物要比彼此距离较远的事物更相似.当为任何未测量的位置预测值时,反距离权重法会采用预测位置周围的测量值与距离预测位置较远的 ...

  5. 【数据可视化应用】绘制和弦图(附Python和R语言代码)

    和弦图(Chord diagram)简介 和弦图(chord Diagram),是一种显示矩阵中数据间相互关系的可视化方法,节点数据沿圆周径向排列,节点之间使用带权重(有宽度)的弧线链接.其适合节点数 ...

  6. 【数据可视化应用】绘制峰峦地图(附Python和R语言代码)

    Python版本 Python-ridge_map包简介 ridge_map包作为Python第三方包就是为绘制"山峦"地图而生,其官网为:https://github.com/C ...

  7. 【数据可视化应用】绘制QQ图(附Python和R语言代码)

    QQ图(Quantile-Quantile Plots)含义简单介绍 「含义」: QQ图是用于验证一组数据是否符合正态分布,或者验证某两组数据是否来自同一分布情况,是一种散点图,通常情况下,其横坐标为 ...

  8. 【数据可视化应用】绘制森林图(附Python和R语言代码)

    森林图(Forest Plot)的简单介绍 森林图(Forest Plot) 常用于Meta分析结果展示使用.森林图(可以将观察到的效果.置信区间以及每个研究对象的权重等信息全部表示出来,是一种简单直 ...

  9. 深度剖析目标检测算法YOLOV4

    深度剖析目标检测算法YOLOV4 目录 简述 yolo 的发展历程 介绍 yolov3 算法原理 介绍 yolov4 算法原理(相比于 yolov3,有哪些改进点) YOLOV4 源代码日志解读 yo ...

最新文章

  1. 算法----- 给定一颗二叉树,找到二叉树上任意两个节点之间的距离(Java版本)
  2. python实现二叉堆中的大顶堆(大根堆)
  3. 云计算学习(1-1)云计算的定义
  4. scrum回顾_3步开好回顾会 | IDCF FDCC认证学员作品
  5. vfp 中调用硬盘_硬盘你真的选对了么?固态真的好用么?细数硬盘这些年出现的坑!...
  6. 【食安云桥】python 文件内批量长度除以3.5替换
  7. python 携程订单接口_携程api开发
  8. 万字详解!Git 入门最佳实践 !
  9. 【精选】表情包斗图小程序(可引流,开通流量主,权益外卖cps,带pc后台管理)
  10. 新三板精选层股票名单 新三板精选层概念股龙头
  11. 如何清空MSMQ的队列消息
  12. 15个常用excel函数公式_会计财务最常用的15个公式函数,建议收藏
  13. 计算机硬件经常使用十六,[单选,A型题] 桂枝在桂枝加桂汤、桂苓五味甘草汤中的主要作用是()...
  14. 使用SRS搭建流服务器使用ffmpeg推流用VLC拉流
  15. 学会使用LoadRunner录制脚本
  16. 是时候停止说“软件架构”了 It’s Time to Stop Saying “Software Architecture”
  17. 用组策略统一域中所有客户端桌面
  18. 原生JS的HTTP请求相关知识
  19. SQL server连接不上服务器时的解决方案
  20. Linux中为什么sem_open返回0,我可以在下面的程序中使用sem_open,但是我在这里看到崩溃?...

热门文章

  1. 骁龙805支持4K显示 内存带宽翻倍是亮点
  2. win10的更新怎么关闭计算机,如何彻底关掉win10自动更新_彻底关掉win10自动更新的三种方法...
  3. 六大设计原则-开闭原则
  4. 2个或多个路由器有线连接怎么设置
  5. 【ATF】林伟:大数据计算平台的研究与实践
  6. css规则首行缩进,首行缩进css_css控制段落首行缩进 text-indent
  7. Golengate管理--OGG|利用 OGG 迁移 Oracle11g 到 19C
  8. Windows使用公网IPv6建站过程
  9. 项目打包打的是什么包_你好,尾款人!加油,打工人!这些都是什么梗?进来看看吧(附表情包)...
  10. MYSQL死锁之路 - 常见SQL语句的加锁分析