作者:金良(golden1314521@gmail.com) csdn博客: http://blog.csdn.net/u012176591

状态转移概率分布矩阵

A=⎡⎣⎢⎢0.40.30.40.10.40.30.50.30.3⎤⎦⎥⎥

A = \begin{bmatrix}0.4 &0.1&0.5 \\[0.3em]0.3&0.4&0.3\\[0.3em]0.4&0.3&0.3\end{bmatrix}
观测概率分布矩阵

B=⎡⎣⎢⎢0.50.40.70.50.60.3⎤⎦⎥⎥

B = \begin{bmatrix}0.5&0.5 \\[0.3em]0.4&0.6\\[0.3em]0.7&0.3\end{bmatrix}
初始概率分布

π=[0.20.40.4]

\pi = \begin{bmatrix}0.2&0.4&0.4\end{bmatrix}

αt(i)=P(o1,o2,⋯,ot,it=qi|λ)\alpha_t(i)=P(o_1,o_2,\cdots,o_t,i_t=q_i|\lambda)
βt(i)=P(ot+1,ot+2,⋯,oT|it=qi,λ)\beta_t(i)=P(o_{t+1},o_{t+2},\cdots,o_T|i_t=q_i,\lambda)
P(O|λ)=∑Ni=1∑Nj=1αt(i)aijbj(ot+1)βt+1(j)P(O|\lambda)=\sum_{i=1}^{N}\sum_{j=1}^{N}\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)

前向算法

def frontforward(A,B,PI,O,t):  # 0<=t<T时,输出向量,t=T时输出最终概率# n是状态数,m是观测数n,m = np.shape(B)T = np.shape(O)[0]if 0< t < T: # 当t小于等于0时,按t等于0计算front = frontforward(A,B,PI,O,t-1)return [np.dot(front,A[:,i])*B[i][O[t]] for i in range(n)]elif t <= 0:return [PI[i]*B[i][O[t]] for i in range(n)]else: #当t大于等于T时,按t等于length计算return np.sum(frontforward(A,B,PI,O,t-1))

后向算法

def backforward(A,B,PI,O,t):# 0<=t<=T-1时输出向量,t=-1时输出最终概率n,m = np.shape(B)T = np.shape(O)[0]if 0<=t<=T-2:back = backforward(A,B,PI,O,t+1)return [np.dot(back*B[:,O[t+1]],A[i,:]) for i in range(n)]elif t >= T-1:return [1]*nelse:return np.sum(backforward(A,B,PI,O,0)*PI*B[:,O[0]])

概率计算

def backfront(A,B,PI,O,t):n,m = np.shape(B)T = np.shape(O)[0]if 0<=t<=T-2:return np.sum([frontforward(A,B,PI,O,t)[i]*backforward(A,B,PI,O,t+1)[j]*A[i,j]*B[j,O[t+1]] for i in range(n) for j in range(n)])elif t >= T-1:return frontforward(A,B,PI,O,T)else:return backforward(A,B,PI,O,-1)

测试

print '前向算法frontforward的测试:'
for t in range(6):print 't=%d:'%t,frontforward(A,B,PI,O,t)

前向算法frontforward的测试:
t=0: [0.10000000000000001, 0.16000000000000003, 0.27999999999999997]
t=1: [0.10000000000000001, 0.094799999999999995, 0.054599999999999996]
t=2: [0.04514, 0.02572, 0.066373999999999989]
t=3: [0.026160799999999998, 0.020828519999999996, 0.015059459999999998]
t=4: [0.011368329999999999, 0.0092791955999999981, 0.0071540381999999989]
t=5: 0.0278015638

print '后向算法backforward的测试:'
for t in range(5,-2,-1):print 't=%d:'%t,backforward(A,B,PI,O,t)

后向算法backforward的测试:
t=5: [1, 1, 1]
t=4: [1, 1, 1]
t=3: [0.41000000000000003, 0.47999999999999998, 0.46999999999999997]
t=2: [0.18130000000000002, 0.219, 0.2107]
t=1: [0.11876500000000001, 0.10648200000000001, 0.10678700000000001]
t=0: [0.046159970000000002, 0.052981260000000002, 0.052530590000000002]
t=-1: 0.0278015638

print '计算概率backfront的测试:'
for t in range(-1,6):print 't=%d:'%t,backfront(A,B,PI,O,t)

计算概率backfront的测试:
t=-1: 0.0278015638
t=0: 0.0278015638
t=1: 0.0278015638
t=2: 0.0278015638
t=3: 0.0278015638
t=4: 0.0278015638
t=5: 0.0278015638

一些概率和期望值的计算

def gammat(A,B,PI,O,t,i):prosingle = frontforward(A,B,PI,O,t)[i]*backforward(A,B,PI,O,t)[i]prosum = np.sum([frontforward(A,B,PI,O,t)[i]*backforward(A,B,PI,O,t)[i] for j in range(n)])return 1.0*prosingle/prosum
def xit(A,B,PI,O,t,i,j):prosingle = frontforward(A,B,PI,O,t)[i]*backforward(A,B,PI,O,t+1)[j]*A[i,j]*B[j][O[t+1]]prosum = np.sum([frontforward(A,B,PI,O,t)[i]*backforward(A,B,PI,O,t+1)[j]*A[i,j]*B[j][O[t+1]] for i in range(n) for j in range(n)])return 1.0*prosingle/prosum

对数空间的运算

定义了一个类,用于对数空间的数值计算

class Logspace:def __init__(self):self.LOGZERO = 'LOGZERO'def eexp(self,x):if x == self.LOGZERO:return 0else:return np.exp(x)def eln(self,x):if x == 0:return self.LOGZEROelif x>0:return np.log(x)else:print 'Wrong!!!\n\t negative input error'return np.nandef elnsum(self,elnx,elny):if elnx == self.LOGZERO:return elnyelif elny == self.LOGZERO:return elnxelif elnx > elny:return elnx + self.eln(1+np.exp(elny-elnx))else:return elny + self.eln(1+np.exp(elnx-elny))def elnproduct(self,elnx,elny):if elnx == self.LOGZERO or elny == self.LOGZERO:return self.LOGZEROelse:return elnx + elny

下面是对该类Logspace 的测试语句和测试结果:

logspace = Logspace()elnx = logspace.eln(np.exp(60))
elny = logspace.eln(np.exp(-10))
elnx_plus_y = logspace.elnsum(elnx,elny)
print elnx_plus_y
elnx_prod_y = logspace.elnproduct(elnx,elny)
print elnx_prod_y
logzero = logspace.eln(0)
elnx_plus_y = logspace.elnsum(elnx,logzero)
print elnx_plus_y
elnx_prod_y = logspace.elnproduct(elnx,logzero)
print elnx_prod_y
print logspace.eln(-1)

测试结果:

60.0
50.0
60.0
LOGZERO
Wrong!!!
negative input error
nan

  • 隐马尔科夫模型(HMM)及其实现
    http://blog.csdn.net/ycheng_sjtu/article/details/38865395
  • 大内密探HMM(隐马尔可夫)围捕赌场老千
    http://blog.csdn.net/ppn029012/article/details/8923501
  • 如何用简单易懂的例子解释隐马尔可夫模型?
    http://www.zhihu.com/question/20962240
  • 隐马尔科夫模型
    http://www.52nlp.cn/category/hidden-markov-model/page/4
  • 发现一篇不错的学习隐马尔可夫模型的文章
    http://blog.sciencenet.cn/blog-641976-533895.html
  • Hidden Markov Models in Python
    http://www.cs.colostate.edu/~anderson/cs440/index.html/doku.php?id=notes:hmm2
  • 经典论文 http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=18626
    《A tutorial on Hidden Markov Models and selected applications in speech recognition》
  • http://www.cnblogs.com/CheeseZH/p/4229910.html

HMM-前向后向算法相关推荐

  1. HMM——前向后向算法

    1. 前言 解决HMM的第二个问题:学习问题, 已知观测序列,需要估计模型参数,使得在该模型下观测序列 P(观测序列 | 模型参数)最大,用的是极大似然估计方法估计参数. 根据已知观测序列和对应的状态 ...

  2. HMM 前向 后向 Viterbi算法讲解通透的

    HMM  前向 后向 Viterbi算法讲解通透的 https://blog.csdn.net/xueyingxue001/article/details/52396494 什么是HMM https: ...

  3. HMM前向算法,维比特算法,后向算法,前向后向算法代码

    typedef struct { int N; /* 隐藏状态数目;Q={1,2,-,N} */ int M; /* 观察符号数目; V={1,2,-,M}*/ double **A; /* 状态转移 ...

  4. 机器学习笔记(十四)——HMM估计问题和前向后向算法

    一.隐马尔科夫链的第一个基本问题 估计问题:给定一个观察序列O=O1O2-OTO=O_1O_2\dots O_T和模型u=(A,B,π)u = (\boldsymbol{A,B,\pi}),如何快速地 ...

  5. 机器学习算法 10 —— HMM模型(马尔科夫链、前向后向算法、维特比算法解码、hmmlearn)

    文章目录 系列文章 隐马尔科夫模型 HMM 1 马尔科夫链 1.1 简介 1.2 经典举例 2 HMM简介 2.1 简单案例 2.2 案例进阶 问题二解决 问题一解决 问题三解决 3 HMM模型基础 ...

  6. 隐马尔科夫模型(前向后向算法、鲍姆-韦尔奇算法、维特比算法)

    隐马尔科夫模型(前向后向算法.鲍姆-韦尔奇算法.维特比算法) 概率图模型是一类用图来表达变量相关关系的概率模型.它以图为表示工具,最常见的是用一个结点表示一个或一组随机变量,结点之间的变表是变量间的概 ...

  7. 机器学习算法总结(七)——隐马尔科夫模型(前向后向算法、鲍姆-韦尔奇算法、维特比算法)...

    概率图模型是一类用图来表达变量相关关系的概率模型.它以图为表示工具,最常见的是用一个结点表示一个或一组随机变量,结点之间的变表是变量间的概率相关关系.根据边的性质不同,可以将概率图模型分为两类:一类是 ...

  8. 机器学习算法拾遗:(七)隐马尔科夫模型(前向后向算法、鲍姆-韦尔奇算法、维特比算法)

    1.隐马尔科夫模型HMM 隐马尔科夫模型的图结构如下 从上图中主要有两个信息:一是观测变量xi 仅仅与与之对应的状态变量yi 有关:二是当前的状态变量yi 仅仅与它的前一个状态变量yi-1 有关. 隐 ...

  9. 隐马尔科夫模型(HMMs)之五:维特比算法及前向后向算法

    维特比算法(Viterbi Algorithm) 找到可能性最大的隐藏序列 通常我们都有一个特定的HMM,然后根据一个可观察序列去找到最可能生成这个可观察序列的隐藏序列. 1.穷举搜索 我们可以在下图 ...

  10. 图像处理去噪方法的c语言实验,基于一阶前向后向算法的全变分图像去噪方法与流程...

    本发明涉及图像处理技术领域,具体涉及一种基于一阶前向后向算法的全变分图像去噪方法. 背景技术: 图像复原(imagerestoration)即利用退化过程的先验知识,去恢复已被退化图像的本来面目.图像 ...

最新文章

  1. UVA - 1594 Ducci Sequence
  2. make: warning: file “xxx“ has modification time yyy s in the future 解决方法
  3. linux重新编译mysql_linux下编译安装mysql++ | 学步园
  4. hdu 1002 A + B Problem II(大正整数相加)
  5. Maven命令行使用:mvn clean package(打包)
  6. 使用SQLPLUS生成HTML报表
  7. Eclipse从github上clone项目到开发环境
  8. python编程第四版_清华编程教授强力推荐《Python编程》,指导你如何学习python
  9. linux 命令速查手册之十
  10. CSS3 Flexbox 弹性布局
  11. win10安装vbox没有虚拟网卡_消失的虚拟网卡
  12. more than one device and emulator
  13. Matlab程序如何打包
  14. Windows XP SP3安装后瘦身法
  15. 信息与计算机课件,第一章 信息技术与计算机ppt课件.ppt
  16. ImageOptim-无损图片压缩Mac版
  17. react动态添加背景图片/不同内容添加对应背景
  18. 联合国基金会 广告投放 策略
  19. 从零开始搭建腾讯云服务器
  20. 将数字0-9转为中文大写数字

热门文章

  1. 高通项目端口每次跳出要求安装驱动解决方法
  2. 左右两侧浮动广告代码
  3. 什么是软件危机?软件危机的主要表现是什么?什么是软件?什么是软件工程?什么是软件过程?软件过程与软件工程方法学有何关系?​​​​​​​什么是软件开发方法?软件开发方法主要有哪些?
  4. 3.1 CUDA执行模型概述
  5. 链路层--->ETH(以太网)协议
  6. 30 个Python代码实现的常用功能(附案例源码)
  7. 研华运动控制卡接线图_ADVANTECH研华PCI-1245S运动控制卡4轴DSP架构脉冲型 步进/伺服电机SCARA控制通用PCI卡...
  8. 编程n的阶乘使用while语句_谷歌工程师新作,东北话编程
  9. 【数据结构】二叉树(Binary Tree)
  10. CSDN知名安卓博主