HMM 前向后向算法(转)
最近研究NLP颇感兴趣,但由于比较懒,所以只好找来网上别人的比较好的博客,备份一下,也方便自己以后方便查找(其实,一般是不会再回过头来看的,嘿嘿 -_-!!)
代码自己重新写了一遍,所以就不把原文代码贴过来了。
1. 前向算法(摘自http://www.cnblogs.com/kaituorensheng/archive/2012/12/01/2797230.html)
隐马模型的评估问题即,在已知一个观察序列O=O1O2...OT,和模型μ=(A,B,π}的条件下,观察序列O的概率,即P(O|μ}
如果穷尽所有的状态组合,即S1S1...S1, S1S1...S2, S1S1...S3, ..., S3S3...S3。这样的话t1时刻有N个状态,t2时刻有N个状态...tT时刻有N个状态,这样的话一共有N*N*...*N= NT种组合,时间复杂度为O(NT),计算时,就会出现“指数爆炸”,当T很大时,简直无法计算这个值。为解决这一问题,Baum提出了前向算法。
归纳过程
首先引入前向变量αt(i):在时间t时刻,HMM输出序列为O1O2...OT,在第t时刻位于状态si的概率。
当T=1时,输出序列为O1,此时计算概率为P(O1|μ):假设有三个状态(如下图)1、2、3,输出序列为O1,有三种可能一是状态1发出,二是从状态2发出,三是从状态3发出。另外从状态1发出观察值O1得概率为b1(O1),从状态2发出观察值O1得概率为b2(O1),从状态3发出观察值O1得概率为b3(O1)。因此可以算出
P(O1|μ)= π1*b1(O1)+π2*b2(O1) + π3*b3(O1)= α1(1) + α1(2) + α1(3)
当T=2时,输出序列为O1O2,此时计算概率为P(O1O2|μ):假设有三个状态(如下图)1、2、3,输出序列为O1,有三种可能一是状态1发出,二是从状态2发出,三是从状态3发出。另外从状态1发出观察值O2得概率为b1(O2),从状态2发出观察值O2得概率为b2(O2),从状态3发出观察值O2得概率为b3(O2)。
要是从状态1发出观察值O2,可能从第一时刻的1、2或3状态装换过来,要是从状态1转换过来,概率为α1(1)*a11*b1(O2),要是从状态2转换过来,概率为α1(2)*a21*b1(O2),要是从状态3转换过来,概率为α1(3)*a31*b1(O2),因此
P(O1O2,q2=s1|μ)= α1(1)*a11*b1(O2) + α1(2)*a21*b1(O2) + α1(3)*a31*b1(O2)=α2(1)
同理:P(O1O2,q2=s1|μ)= α1(1)*a12*b2(O2) + α1(2)*a22*b2(O2) + α1(3)*a32*b2(O2)=α2(2)
P(O1O2,q2=s1|μ)= α1(1)*a13*b1(O2) + α1(2)*a23*b3(O2) + α1(3)*a33*b3(O2)=α2(3)
所以:P(O1O2|μ)=P(O1O2,q2=s1|μ)+ P(O1O2,q2=s1|μ)+ P(O1O2,q2=s1|μ)
=α2(1) + α2(2) + α2(3)
以此类推。。。
前向算法
step1 初始化:α1(i) = πi*bi(O1), 1≤i≤N
step2 归纳计算:
step3 终结:
P(O|μ)=
时间复杂度
计算某时刻的某个状态的前向变量需要看前一时刻的N个状态,此时时间复杂度为O(N),每个时刻有N个状态,此时时间复杂度为N*O(N)=O(N2),又有T个时刻,所以时间复杂度为T*O(N2)=O(N2T)。
程序例证
前向算法计算P(O|M):
step1:α1(1) =π1*b1(red)=0.2*0.5=0.1 α1(2)=π2*b2(red)==0.4*0.4= 0.16 α1(3)=π3*b3(red)==0.4*0.7=0.21
step2:α2(1)=α1(1)*a11*b1(white) + α1(2)*a21*b1(white) + α1(3)*a31*b1(white)
...
step3:P(O|M) = α3(1)+α3(2)+α3(3)
2. 后向算法(摘自http://www.cnblogs.com/kaituorensheng/archive/2012/12/03/2800489.html)
对于HMM的评估问题,利用动态规划可以用前向算法,从前到后算出前向变量;也可以采用后向算法,从后到前算出后向变量。
先介绍后向变量βt(i):给定模型μ=(A,B,π),并且在时间 时刻t 状态为si 的前提下,输出序列为Ot+1Ot+2...OT的概率,即
βt(i)=P(Ot+1Ot+2...OT|qt=si,μ)
归纳过程
假设仍然有3个状态
当t=T时,按照定义:时间t 状态qT 输出为OT+1......的概率,从T+1开始的输出是不存在的(因为T时刻是终止终止状态),即T之后是空,是个必然事件,因此βt(i)=1,1≤1≤N
当t=T-1时,
βT-1(i)=P(OT|qT-1=si,μ) = ai1*b1(OT)*βT(1) + ai2*b2(OT)*βT(2) + ai3*b3(OT)*βT(3)
......
当t=1时,
β1(1)=P(O2O3...OT|q2=s1,μ) = a11*b1(O2)*β2(1) + a12*b2(O2)*β2(2) + a13*b3(O2)*β2(3)
β1(2)=P(O2O3...OT|q2=s1,μ) = a21*b1(O2)*β2(1) + a22*b2(O2)*β2(2) + a23*b3(O2)*β2(3)
β1(3)=P(O2O3...OT|q2=s1,μ) = a31*b1(O2)*β2(1) + a32*b2(O2)*β2(2) + a33*b3(O2)*β2(3)
P(O1O2...OT|μ) =
=
=
后向算法
step1 初始化:βT(i)=1, 1≤1≤N
step2 归纳计算:
1≤t≤T-1, 1≤i≤N
step3 求终结和:
P(O|μ)=
时间复杂度
计算某时刻在某个状态下的后向变量需要看后一时刻的N个状态,此时时间复杂度为O(N),每个时刻有N个状态,此时时间复杂度为N*O(N)=O(N2),又有T个时刻,所以时间复杂度为T*O(N2)=O(N2T)。
程序例证
后向算法
计算P(O|M):
step1:β4(1) = 1 β4(2) = 1 β4(3) = 1
step2:β3(1) = β4(1)*a11*b1(white) + β4(2)*a12*b2(white) + β4(3)*a13*b3(white)
...
step3:P(O|M) = π1*β1(1)*b1(O1) + π2*β1(2)*b2(O1) + π3*β1(3)*b3(O1)
3.前向-后向算法(摘自http://www.cnblogs.com/kaituorensheng/archive/2012/12/05/2803182.html)
重新回顾:
前向变量αt(i):在时刻t,在已知模型μ=(A,B,π)的条件下,状态处于si,输出序列为O102...Ot,前向变量为αt(i)
后向变量βt(i):在时刻t,在已知模型μ=(A,B,π)和状态处于si的条件下,输出序列为Ot+1Ot+2...OT,后向变量为βt(i)
公式推导:
P(O,qt=si|μ) = P(O1O2...OT, qt=si|μ)
=P(O1O2...Ot, qt=si,Ot+1Ot+2...OT|μ)
=P(O1O2...Ot, qt=si|μ) * P(Ot+1Ot+2...OT|O1O2...Ot, qt=si,μ)
=P(O1O2...Ot, qt=si|μ) * P(Ot+1Ot+2...OT|qt=si,μ)
=αt(i) * βt(i)
P(O|μ)=
案例分析:
分析:
P(q4=s3|O,M) = P(q4=s3, O|M)/P(O|M)
= P(O,q4=s3|M)/P(O|M)
= α4(3) * β4(3)/
HMM 前向后向算法(转)的更多相关文章
- HMM 自学教程(七)前向后向算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率
隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法 ...
- 条件随机场CRF(二) 前向后向算法评估标记序列概率
条件随机场CRF(一)从随机场到线性链条件随机场 条件随机场CRF(二) 前向后向算法评估标记序列概率 条件随机场CRF(三) 模型学习与维特比算法解码 在条件随机场CRF(一)中我们总结了CRF的模 ...
- 《统计学习方法》P179页10.22前向后向算法公式推导
- 隐马尔可夫(HMM)、前/后向算法、Viterbi算法
HMM的模型 图1 如上图所示,白色那一行描述由一个隐藏的马尔科夫链生成不可观测的状态随机序列,蓝紫色那一行是各个状态生成可观测的随机序列 话说,上面也是个贝叶斯网络,而贝叶斯网络中有这么一种,如下 ...
- 隐马尔可夫模型HMM与维特比Veterbi算法(一)
隐马尔可夫模型HMM与维特比Veterbi算法(一) 主要内容: 1.一个简单的例子 2.生成模式(Generating Patterns) 3.隐藏模式(Hidden Patterns) 4.隐马尔 ...
- HMM-前向后向算法
基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,...\) \(\lambda(A,B,\pi)\) 状态转移概率 \(A = \{a ...
- HMM-前向后向算法(附python实现)
基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,...\) \(\lambda(A,B,\pi)\) 状态转移概率 \(A = \{a ...
- HMM-前向后向算法(附代码)
目录 基本要素 HMM三大问题 概率计算问题 前向算法 后向算法 前向-后向算法 基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,.. ...
随机推荐
- NhibernateProfiler-写个自动破解工具(源码)
04 2013 档案 [屌丝的逆袭系列]是个人都能破解之终结NhibernateProfiler-写个自动破解工具(源码) 摘要: 破解思路分析及手动破解 增加“附加到进程”功能--功能介绍增加“ ...
- Delphi的注册表操作
转帖:Delphi的注册表操作 2009-12-21 11:12:52 分类: Delphi的注册表操作 32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创 ...
- Ninject的项目情况
Ninject的项目情况 首先,它有很多的项目组成,适合不同的环境,当然它有几个基本的核心库. 为什么它会有这么多的库呢?因为轻量级,易于使用和被扩展是它的目标,代码越是少,你使用代码的可能性越高嘛. ...
- KMP 代码 暂存
#include <stdio.h> #include <string.h> ],B[]; ]; int n, m; void _next(){ ; ; next[] = ; ...
- iOS基础 - 多线程线程
一.多线程的应用 l 充分发挥多核处理器的优势,并发(同时执行)执行任务让系统运行的更快.更流畅 二.进程与线程概念 l 一个运行的程序就是一个进程或者叫做一个任务 l 一个进程至少包含一个线程,线程 ...
- 玩转python之字符串逐个字符或逐词反转
众所周知,python中的字符串是无法改变的,反转一个字符串自然要创建一个拷贝:最简单的方法,当然是步长为“-1”的切片: result = astring[::-1] 如果要是按单词来反转,需要三步 ...
- ASP.NET MVC实现剪切板功能
前言 关于复制粘贴的功能,好像不用劳师动众的写后端代码,JS就可以,但正如大家所知道的,兼容性问题,当然这么通用的功能怎么可能没有一个通用的方案呢,于是便找到了一款jquery插件 jquery.cl ...
- Sublime2 Text编辑器使用技巧
Sublime2 Text编辑器使用技巧 ------------------------------------软件使用----------------------------------- ...
- SOCKET网络编程细节问题(4)
SOCKET网络编程快速上手(二)——细节问题(4) 5.慢系统调用及EINTR 还记得前面readn和writen函数么?里面有个EINTR,现在就来谈谈这个,这个很重要. Linux世界有个叫信号 ...
- java正则表达式验证标点符号
统计标点符号个数 String str = "\""..,!,"; int count = 0; Pattern pattern = Pattern.compi ...