NLP系列学习:前向算法和后向算法

在上一篇文章里,我们简单的概述了隐马尔科夫模型的简单定义

在<CRF-tutorial>这一篇文章里,我们可以看到HMM经过发展之后是CRF产生的条件,因此我们需要学好隐马尔科夫模型.

在这一部分,我比较推荐阅读宗成庆老师的<自然语言处理>这本书,这一部分宗老师写的很不错,相关的资源在我之前的文章中已经上传,有兴趣的小伙伴可以阅读下.

回到正题,说起HMM,我们知道他是一个产生型模型.这样我们可以把它看作为一个序列化判别器,比方说我们说一句话:

上边是我们说的话,我们说一句话,其实就可以看作为一个状态序列,而下边对应的,我们其实就可以看作为一个判别器,假如我们把上边的说的话和下边的状态序列加上一个符号,如下图所示

再去求Si->Oj的概率,这样我们写成:

这样我们就可以引申出隐马尔克夫模型的三大问题:

①:估计问题

②:序列问题

③:训练问题或参数估计问题

为了更加容易理解这三个问题,我发现之前有一个博客的掷骰子的例子很生动,便特地引用过来,方便自己理解:

假设手里有三个不同的骰子。第一个骰子是我们平常见的骰子(称这个骰子为D6), 6个面,每个面(1,2,3,4,5,6)出现的概率是1/6。第二个骰子是个四面体(称 这个骰子为D4),每个面(1,2,3,4)出现的概率是1/4。第三个骰子有八个面 (称这个骰子为D8),每个面(1,2,3,4,5,6,7,8)出现的概率是1/8。


现在我们开始掷骰子,我们先从三个骰子里挑一个,挑到每一个骰子的概率都是1/3。 然后我们掷骰子,得到一个数字,1,2,3,4,5,6,7,8中的一个。不停的重复上述过程,我们会得到一串数字,每个数字都是1,2,3,4,5,6,7,8中的一个。例如我们可能得到这么一串数字(掷骰子10次):1 6 3 5 2 7 3 5 2 4 .

那这时候我们就把这投掷出来的这些数字成为可见状态链,但是在隐马尔可夫模型中,我们丌仅仅有这么一串可见状 态链,还有一串隐含状态链。在这个例子里,这串隐含状态链就是你用的骰子的序列.比如,隐含状态链有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8

但是一般来说,我们用的马尔科夫链都是隐含状态链, 因为隐含状态(骰子)之间存在转换概率(transition probability)。在我们这个例子里,D6的下一个状态是 D4,D6,D8的概率都是1/3。D4,D8的下一个状态是D4,D6,D8的转换概率也都 一样是1/3。这样设定是为了最开始容易说清楚,但是我们其实是可以随意设定转换概 率的。比如,我们可以这样定义,D6后面不能接D4,D6后面是D6的概率是0.9,是 D8的概率是0.1。这样就是一个新的HMM。 同样的,尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率(emission probability)。就我们的例子来说,六面骰(D6)产生1的输出概率是1/6。产生2,3,4,5,6的概率也都是1/6。我们同样可以对输出概率进行其他定义。比如我有一个被赌场动过手脚的六面骰子,掷出来是1的概率更大,是 1/2,掷出来是2,3,4,5,6的概率是1/10。 这时候我们再结合这个例子去理解并解决HMM中的三大问题就会容易许多了:

第一个问题:

我们知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道每次掷出来的都是哪种骰子(隐含状态链)。

第二个问题:

还是知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道掷出这个结果的概率.

第三个问题:

知道骰子有几种(隐含状态数量),但是并不知道每种骰子是什么(转换概率),观测到很多次掷骰子的结果(可见状态链),我想反推出每种骰子是什么(转换概率)。

1:估计问题:

在我们知道我们有几种筛子的时候,并且知道筛子是什么,并且已知结果,这时候我们再去推测是哪一种筛子就会容易很多,是可以通过穷举法进行解决的,说白话就是推测所有的隐含状态序列,并且再去计算所以的可能观测序列的概率,但是这样的方法也有问题,如果你的可能,就跟上边的三个筛子一样,还比较OK,因为你的概率还是很大,比较容易猜得对,但是你有100个长度的话,不说多了,每个长度上对应的隐含状态为2,这样你的时间复杂度就是O(2的100方),这个复杂度是很高的,尽管很简单,但是还是不实用的.就跟我们查找中的直接查找一样,尽管简单,但是实则更困难.这样的话,我们就采用了前向算法和后向算法来去计算这个问题.

那下边我们就去推一下这个公式:

首先,我们要假设一个变量at(i),这个变量的意义是说我们在t时刻(1<t<T-1),位于si的状态下,HMM输出了序列O1......Ot,这时候at(i)可以表示为:


而我们接下来要做的是计算这个at(i),然后就可以根据at(i)来去计算在T时刻的概率,最后也就计算出P(O|u),这时候O是0-T时刻的概率,我们自然就可以计算出所有时刻的概率.

在这里,我们要用归纳思想去计算在t+1时刻的at+1(i):

这时候我们通过一张图去直观的表示从i到j的状态转移过程:

最终的计算得到的概率为:

那后向算法其实就跟前向算法类似,过程图如下:

那么由上述所知,前向和后向算法的时间复杂度均是O(N2T),这个相比起之前,已经优化了太多,其中N是隐藏状态的长度,T是序列的长度.

下一篇文章,我们将去学习HMM中的第二个问题:估计序列问题

参考文章:

1:www.cnblogs.com/skyme/p/465…

2:HMM经典论文《A tutorial on Hidden Markov Models and selected applications in speech recognition》


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java日期处理 开始时间-结束时间查询

//开始时间 timeBegin " 00:00:00"; //结束时间 timeEnd " 23:59:59"; //时间转换 SimpleDateFormat format new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //Java时间类型转换成Long类型(可封装成工具类) public static Long stringToLong(St…

angular路由操作中'#'字符的解决办法

var appangular.module("myapp",["ngRoute"]);app.controller("ctr",function($scope){});//angular1.6.0以上版本需要配置app.config(["$locationProvider",function($locationProvider){ $locationProvider.hashPrefix(""…

【TypeError: float() argument must be a string or a number, not ‘map’】

初始 相关系数过滤法调用函数 from sklearn.feature_selection import SelectKBest from scipy.stats import pearsonr SelectKBest(lambda X,Y:np.array(map(lambda x:pearsonr(x,Y),X.T)).T,k2) .fit_transform(X_test,y_test) TypeError: float() argument must be a strin…

CvScalar

CvScalar定义可存放1—4个数值的数值&#xff0c;其结构如下。 typedef struct CvScalar { doubleval[4]; } CvScalar; CvScalar pt&#xff1b; 如果使用的图像是1通道的&#xff0c;则pt.val[0]中存储数据 如果使用的图像是3通道的&#xff0c;则pt.val[0]&#xff0c;pt…

UVA1493 - Draw a Mess(并查集)

UVA1493 - Draw a Mess(并查集) 题目链接 题目大意:一个N * M 的矩阵&#xff0c;每次你在上面将某个范围上色&#xff0c;不论上面有什么颜色都会被最新的颜色覆盖&#xff0c;颜色是1-9&#xff0c;初始的颜色是0.最后输出这个矩形中。每一个颜色有多少个。某个范围这个分为了…

Hyper-v Server 2012 Release Candidate 部署体验

很多人知道&#xff0c;Microsoft Hyper-V分为两种类型&#xff1a;一种是作为Windows Server的一个组件&#xff0c;另一种是作为虚拟化产品的单独服务器。虽然两者都是技术上的Hyper-V&#xff0c;每个版本的特性和用例各不相同。 Hyper-V Server直接在物理机器硬件上运行&am…

Unity 读取资源(图片)

方法一&#xff1a; 采用Resource.Load方法读取&#xff0c;读取在Unity中Assets下Resources目录下的资源名&#xff08;不采用后缀&#xff09;。 //图片放在Asset/Resources/ Texture2D tex (Texture2D)Resources.Load("图片名称"); 方法二&#xff1a; 采用WWW类…

【Python3 SelectKBest 调用personer出现的错误】

初始 相关系数过滤法调用函数 from sklearn.feature_selection import SelectKBest from scipy.stats import pearsonr SelectKBest(lambda X,Y:np.array(map(lambda x:pearsonr(x,Y),X.T)).T,k2) .fit_transform(X_test,y_test) TypeError: float() argument must be a strin…

ABB机器人的错误处理

ABB机器人的错误处理 errnum 数据类型 errnum用于描述在执行过程中&#xff0c;发生的所有可恢复的错误。例如程序执行时&#xff0c;被零除。 如果机器人程序执行过程中检测到一个错误&#xff0c;错误非致命&#xff0c;可以被错误处理程序处理。 这类错误的典型例子是…

面向对象的七大原则

总脉络图&#xff1a; 一&#xff1a;单一职责原则(全称&#xff1a;“Single-Responsibility Principle”)又称 单一功能原则 核心&#xff1a;解耦和增强内聚性&#xff08;高内聚&#xff0c;低耦合&#xff09; 说明&#xff1a; 就一个类而言&#xff0c;应该只专注于做一…

福建工程学院寒假作业G题

涨姿势题就是所谓的优化题&#xff0c;在组队赛中&#xff0c;队伍发现了一题水题&#xff0c;那么应该交给谁去处理&#xff1f;作为处理水题的代码手&#xff0c;应该具备什么样的素养&#xff1f;1&#xff0c;要快&#xff0c;水题拼的就是速度&#xff01;2&#xff0c;不…

excel 多列匹配相等后 引用值

2019独角兽企业重金招聘Python工程师标准>>> 场景 如图下&#xff0c;当A、B列与E、F列皮配上&#xff0c;C列则引用G列的值 原理 VLOOKUP只能查找单列值。我们可以把多列值拼接后形成一个虚拟列&#xff0c;然后VLOOKUP函数查找这个虚拟列进行匹配。 在C1处输入下…

【BUG调试】——OSError: Caught OSError in DataLoader worker process 0

目录 问题描述&#xff1a; 参考链接 问题分析 解决方案 出现情况 问题描述&#xff1a; 在使用pytorch搭建了VGG从头开始训练时出现了以下问题&#xff1a; OSError: Caught OSError in DataLoader worker process 0 参考链接 参考up主视频&#xff1a;4.2 使用pytor…

cvAdd()和 cvAddS()函数的使用

函数原型如下&#xff1a; voidcvAdd( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* maskNULL ); src1 第一个原数组 src2 第二个原数组 dst 输出数组 mask 操作的复盖面, 8-bit单通道数组; 只有复盖面指定的输出数组被修改。 函数 cvAdd 加一个数…

设计模式之接口隔离原则

这个原则想必大家从字面就可以猜出大体的含义&#xff0c;其实这个原则可以说是依赖倒置原则的一种进化补充&#xff0c;因为依赖倒置原则告诉我们实现类的各种依赖关系应该尽量隔离在抽象里面&#xff0c;同时底层的接口协议不应该依赖上层协议的变更而变更&#xff0c;所以我…

iOS 图解多线程

转载于:https://www.cnblogs.com/OnNineMonkey/p/5385963.html

Egret之位图字体

1 , 关于位图字体的制作 2 , egret官方提供的资源 看看cartoon-font.fnt的内容 {"file":"cartoon-font.png","frames":{ "A":{"x":1,"y":54,"w":21,"h":24,"offX":2,"offY&qu…

【机器视觉】——平面测量实际尺寸(像素尺寸转物理尺寸)

目录 方法一:比例尺法 方法:二:三角法 方法三:相机标定 以下方法均在平面的前提下进行 方法一:比例尺法 在一张纸上绘制一个带刻度的直线,将纸张放在摄像头下,抓取任意两点的像素坐标,计算像素距离pd,再根据刻度读取实际距离ad,根据两者可以求出缩放比例,即地图上…

图像处理基本算法-滤波

线性滤波器的向量表示&#xff1a; W是一个大小为m*n的滤波器的系数&#xff0c;Z为由滤波器覆盖的相应图像的灰度值。 线性滤波器所能是实现的就是乘积求和操作。 几种常见的滤波器&#xff1a; 平滑空间滤波器如均值滤波 统计排序滤波器如中值滤波 锐化空间滤波器如锐化…

20145122《Java面向对象程序设计》实验二实验报告

实验名称&#xff1a; Java面向对象程序设计 实验内容&#xff1a; 初步掌握单元测试和TDD理解并掌握面向对象三要素&#xff1a;封装、继承、多态初步掌握UML建模熟悉S.O.L.I.D原则了解设计模式 PSP时间 步骤耗时百分比需求分析1h12.5%设计1h12.5%代码实现3h37.5%测试1h12.5%分…