zoukankan      html  css  js  c++  java
  • 隐马尔可夫模型(一)

    基本概念

    隐马尔可夫由初始概率分布、状态转移概率分布以及观测概率分布确定。

    设Q是所有可能的状态,V是所有可能的观测

    Q={q1,q2,...,qN}, V={v1,v2,...,vM}

    其中,N为所有可能的状态数,M为所有可能的观测数。

    设O是一个长度为T的观测序列,I为对应的状态序列

    O={o1,o2,...,oT}, I={i1,i2,...,iT}

    状态转移概率矩阵A为

    A=[aij]NxN

    其中aij=P(qj|qi),表示t时刻处于qi状态转移到t+1时刻qj状态的条件概率。

    观测概率矩阵B为

    B=[bi(m)]NxM

    其中bi(m)=P(vm|qi),表示t时刻处于qi状态下观测到vm的条件概率。

    初始状态概率向量π

    π=(πi)

    其中πi=P(i1=qi),表示t=1时刻下状态为qi的概率。

    隐马尔可夫模型λ由初始状态概率向量π、状态转移概率矩阵A和观测概率矩阵B决定(隐马尔可夫模型的三要素),即

    λ=(A,B,π)

    隐马尔可夫模型基于以下两个基本假设:

     (1)齐次马尔可夫性假设,在任意时刻t的状态只依赖于其前一时刻(t-1)的状态,即

    P(it|it-1,ot-1,...i1,o1)=P(it|it-1),  t = 1,2,...T

    其中t=1时,P(i1|i0)=πi

    (2)观测独立性假设,任意时刻的观测只依赖于该时刻的马尔可夫链的状态,与其他任意前后时刻的观测和状态均无关,即

    P(ot|iT,oT,...it+1,ot+1,it,it-1,ot-1,...i1,o1)=P(ot|it)

     3个基本问题

    隐马尔可夫模型有三个基本问题:

    1. 概率计算问题。给定模型λ=(A,B,π)和观测序列O={o1,o2,...oT},计算此观测序列出现的概率P(O|λ).
    2. 学习问题。已知观测序列O=(o1,o2,...,oT),估计模型参数λ=(A,B,π),使得在该模型下观测序列的概率P(O|λ)最大,即用极大似然估计的方法估计参数。
    3. 预测问题(解码问题)。已知模型λ=(A,B,π)和观测序列O={o1,o2,...oT},求使得条件概率P(I|O)最大的状态序列I=(i1,i2,...iT),也就是求最有可能的状态序列。

    由于目前自然语言处理(NLP)中常利用这个模型来进行中文分词,这里先介绍一下这个例子,帮助理解,具体后面会详细介绍。

    中文分词

    状态集合Q={B,E,M,S},分别表示开始、结束、中间、单字词,这样从开始到结束表示一个词,一个S状态的观测是一个单字词。

    观测序列则为中文字符串。

    不难发现,中文分词对应于解码问题。而模型参数一般可以是人工标注(状态)来统计得到各种概率,或者通过上面的学习问题来得到,这里不深入阐述,后面再详细介绍。

    概率计算

    直接计算法

     给定模型λ=(A,B,π)和观测序列O={o1,o2,...oT},计算此观测序列出现的概率P(O|λ)。我们自然而然地想到用全概率公式,也就是将每种可能的状态序列下的观测序列的条件概率相加,其和就是P(O|λ),假设所有可能的状态序列集合为,则

    上式中λ表示给定模型λ的条件下,为避免视觉混淆,可以直接将λ从上式中扣掉,变成,

                   (1)

    其中,P(O|I)表示已知状态序列I的条件下,观测序列O出现的概率,根据上文独立性假设,各观测的出现相互独立,则,

        (2)

    P(I)表示状态序列的概率,假设状态序列为I={i1,i2,...iT},根据上文齐次马尔可夫性假设,各状态只依赖于前一状态,则其概率为

       (3)

    然而,由于状态序列集合的数量非常大,可能的状态数位N,根据排列原理,长度为T的状态序列的数量为N^T,计算量非常大,所以需要寻找更好的方法,上面的直接计算法是将观测序列和状态序列的概率独立计算的,显然如果结合这两种序列,并降低一些重复的计算,达到降低计算量。

    前向算法

    前向概率

    给定隐马尔可夫模型λ,定义到时刻t部分观测序列o1,...ot,且状态为it=qi的概率为前向概率,

                   (4)

    显然有,

    t=1时,

    t=2时,

    ...

    更一般地,t=t时,

           (5)

    所以目标概率,已知模型λ求观测序列出现的概率为,

                 (6)

    其中T为观测序列的长度。

     观察上面的前向概率的结构不难发现,使用前向概率,通过引入状态变量,就可以从上一时刻t-1的观测序列递推出下一时刻t的观测序列出现的概率。

    既然有前向算法,那么对称地,就是有后向算法。

    后向算法

    后向概率

    给定隐马尔可夫模型λ,定义在时刻t状态为qi的条件下,从t+1到T的部分观测序列为ot+1,ot+2,...,oT的概率为后向概率,则

              (7)

    于是根据上文的两个基本假设有,

    t=T-1时(注意t=T时,在此时刻之后已经没有观测序列了,我们先不讨论t=T的情况),

     , 其中,i为T-1时刻的状态iT-1,j表示下一时刻T的状态iT

    t=T-2时,

     , 其中,i表示T-2时刻的状态iT-2,j表示下一时刻T-1的状态iT-1

    更一般地,t=t时,

         (8), 其中, i表示t时刻的状态it,j表示下一时刻t+1的状态it+1

    观察上三式,为了计算和表示方法,我们增加

    t=T时

    这样,t=T-1时也满足(8)式。

    向后概率计算的是在上一时刻t假设给定状态it,那么在t时刻之后,新的部分观测序列出现的概率,于是可以这么认为,t=T时,总是会出现一个新的部分观测序列(长度为0),其概率为1。这个概率就作为我们计算后向概率的初始值。

    现在可以知道,当t=0时,后向概率计算状态为i0条件下的观测序列o1,o2,...,oT的出现概率,此即我们要求的目标概率

                 (9)

    其中t=0时刻的状态i0并不是一个实际观测时刻的状态,t=1时刻才是真正开始观测的第一个状态,所以a0i表示从还没开始观测开始第一个观测到的状态为i的状态转移概率,其实就是状态i的初始概率πi

    下一篇介绍隐马尔可夫模型三个问题中的第二个问题:学习问题

    ref

    • 统计学习方法,李航

    代码

    可以参考github上JIEBA分词

  • 相关阅读:
    OpenGL学习之路(四)
    OpenGL学习之路(三)
    ajax请求成功后新开窗口window.open()被拦截解决方法
    Mysql日志解析
    Kibana+Logstash+Elasticsearch 日志查询系统
    谈谈Redis的SETNX
    常用前端开发工具合集
    Media Queries 详解
    启动mysql时显示:/tmp/mysql.sock 不存在的解决方法
    找不到mysql.sock,mysql.sock丢失问题解决方法
  • 原文地址:https://www.cnblogs.com/sjjsxl/p/6957818.html
Copyright © 2011-2022 走看看