概率图模型1:隐马尔科夫(1)

来源:互联网 发布:python exit 返回值 编辑:程序博客网 时间:2024/06/07 10:15

作者:相国大人

  • 概率图模型系列博文目录实时更新点此处
  • 导读
    • 隐马尔科夫模型
      • 两个基本假设
    • 基本定义
      • 隐马尔科夫模型的3个基本问题
      • 概率计算问题
        • 前向算法
        • 后向算法


写这篇博文用了很多时间和精力,如果这篇博文对你有帮助,希望您可以打赏给博主相国大人。哪怕只捐1毛钱,也是一种心意。通过这样的方式,也可以培养整个行业的知识产权意识。我可以和您建立更多的联系,并且在相关领域提供给您更多的资料和技术支持。

赏金将用于拉萨儿童图书公益募捐

手机扫一扫,即可:

附:《春天里,我们的拉萨儿童图书馆,需要大家的帮助


概率图模型系列博文目录(实时更新,点此处)


1. 导读

参考文献

  • 《机器学习郑捷》第11章
  • 机器学习周志华 14章
  • 《统计学系方法》第10章
  • 《概率图模型》第3章贝叶斯网表示和马尔科夫
  • 《驾驭文本》

隐马尔科夫模型

两个基本假设:

  1. 齐次马尔科夫性假设:隐藏的马尔科夫链在任意时刻t的状态只依赖于前一时刻的状态,与其他时刻的状态及观测无关,也与时刻t无关。

  2. 观测独立性假设:任意时刻的观测只依赖于该时刻的马尔科夫链的状态,与其他观测及状态无关。

说人话,就下面这个图,其中箭头和连边表示概率依赖。

这里写图片描述

从这个图中,我们可以很轻松的对后面的一些公式做推导。比如:

(ot+1|o1:t,It+1=qi)=(ot+1|It+1=qi)(1.1)

上面的公式为了书写简便,我们省略掉了概率符号P(下同),并且用o1:t表示(o1,,ot)(下同)。
(It+1=qi|o1:t,It=qj)=(It+1=qi|It=qj)(1.2)

(ot+1:T|It+1=qi,It=qi)=(ot+1:T|It+1=qi)(1.3)

(ot+2:T|It+1=qj,ot+1)=(ot+2:T|It+1=qj)(1.4)

(It+1|o1:t,It)=(It+1|It)(1.5)

(ot+1|It+1,o1:t,It)=(ot+1|It+1)(1.6)

基本定义:

转移概率aij=(It+1=qj|It=qi)

观测概率bj(ot)=(ot|It=qj)

初始状态概率πi=P(I1=qi)

隐马尔科夫模型的3个基本问题

  1. 概率计算
  2. 学习问题
  3. 预测问题/解码问题

概率计算问题

前向算法

前向概率αt(i)=(o1:t,It=qi)

转移概率aij=(It+1=qj|It=qi)

观测概率bj(ot)=(ot|It=qj)

初始状态概率πi=P(I1=qi)

初始前向概率:

α1(i)=(o1,I1=qi)=(I1=qi)(o1|I1=qi)=πibi(o1)(1.8)

前向概率的迭代推导:
αt+1(i)=(o1:t+1,It+1=qi)=(o1:t,It+1=qi)(ot+1|o1:t,It+1=qi)=(o1:t,It+1=qi)(ot+1|It+1=qi)((1.1))=(o1:t,It+1=qi)bi(ot+1)=j(o1:t,It=qj,It+1=qi)bi(ot+1)=j(o1:t,It=qj)(It+1=qi|o1:t,It=qj)bi(ot+1)=j(o1:t,It=qj)(It+1=qi|It=qj)bi(ot+1)((1.2))=jαt(j)ajibi(ot+1)(1.9)

终止状态推导:
P(O|λ)=(o1:T|λ)=iN(o1:t,IT=qi)=iNαT(i)(1.10)

算法1.1(观测序列概率的前向算法)

输入:隐马尔科夫模型λ,观测序列O

输出:观测序列概率P(O|λ)

  1. 根据公式(1.8),设定初值。

  2. 根据公式(1.9)递推。其中t=1,2,,T1

  3. 终止。根据公式(1.10)得到输出。

python实现(李航《统计学习方法》177页例题10.2):

#!/usr/bin/env python# -*- coding: UTF-8 -*-"""@author: XiangguoSun@contact: sunxiangguodut@qq.com@file: forward_prob.py@time: 2017/3/13 8:53@software: PyCharm"""import numpy as npdef forward_prob(model, Observe, States):    '''    马尔科夫前向算法    '''    A, B, pi = model    N = States.size    T = Observe.size    alpha = pi*B[:, Observe[0]]    print "(1)计算初值alpha_1(i):   ",alpha    print "(2) 递推..."    for t in xrange(0, T-1):        print "t=", t+1,"   alpha_",t+1,"(i):",alpha        alpha = alpha.dot(A)*B[:, Observe[t+1]]    print "(3)终止。alpha_",T,"(i):    ", alpha    print "输出Prob:  ",alpha.sum()    return alpha.sum()if __name__ == '__main__':    A = np.array([[0.5, 0.2, 0.3],                  [0.3, 0.5, 0.2],                  [0.2, 0.3, 0.5]])    B = np.array([[0.5, 0.5],                  [0.4, 0.6],                  [0.7, 0.3]])    pi = np.array([0.2, 0.4, 0.4])    model = (A, B, pi)    Observe = np.array([0, 1, 0])    States = np.array([1, 2, 3])    forward_prob(model,Observe,States)

后向算法

后向概率:βt(i)=(ot+1:T|It=qi)

初始后向概率:βT(i)=1,i=1,2,,N

后向概率迭代推导:

βt(i)=(ot+1:T|It=qi)=jN(ot+1:T,It+1=qj|It=qi)=jN(It+1=qj|It=qi)(ot+1:T|It+1=qj,It=qi)=jN(It+1=qj|It=qi)(ot+1:T|It+1=qj)((1.3))=jN(It+1=qj|It=qi)(ot+1|It+1=qj)(ot+2:T|It+1=qjot+1)=jNaijbj(ot+1)βt+1(j)(1.11)

终止状态推导:
P(O|λ)=(o1:T|λ)=i=1N(o1:T,I1=qi)=i=1N(I1=qi)(o1:T|I1=qi)=i=1N(I1=qi)(o1|I1=qi)(o2:T|o1,I1=qi)=i=1Nπibi(oi)(o2:T|I1=qi)=i=1Nπibi(oi)β1(i)(1.12)

算法1.2(观测序列概率的后向算法)

输入:隐马尔科夫模型λ,观测序列O

输出:观测序列概率P(O|λ)

  1. 设定后向概率初值为1。
  2. 根据公式(1.11)递推。其中t=T1,T2,,1
  3. 终止。根据公式(1.12)得到输出。

python实现(李航《统计学习方法》177页例题10.2):

#!/usr/bin/env python# -*- coding: UTF-8 -*-"""@author: XiangguoSun@contact: sunxiangguodut@qq.com@file: markov.py@time: 2017/3/13 8:53@software: PyCharm"""import numpy as npdef forward_prob(model, Observe, States):    '''    马尔科夫前向算法    '''    A, B, pi = model    N = States.size    T = Observe.size    alpha = pi*B[:, Observe[0]]    print "(1)计算初值alpha_1(i):   ",alpha    print "(2) 递推..."    for t in xrange(0, T-1):        alpha = alpha.dot(A)*B[:, Observe[t+1]]        print "t=", t + 1, "   alpha_", t + 1, "(i):", alpha    print "(3)终止。alpha_",T,"(i):    ", alpha    print "输出Prob:  ",alpha.sum()    return alpha.sum()def backward_prob(model,Observe,States):    '''      马尔科夫后向算法      '''    A, B, pi = model    N = States.size    T = Observe.size    beta = np.ones((N,))  # beta_T    print "(1)计算初值beta_",T,"(i):   ", beta    print "(2) 递推..."    for t in xrange(T - 2, -1, -1):  # t=T-2,...,0        beta = A.dot(B[:, Observe[t + 1]] * beta)        print "t=", t + 1, "   beta_", t + 1, "(i):", beta    print "(3)终止。alpha_", 1, "(i):    ", beta    prob = pi.dot(beta * B[:, Observe[0]])    print "输出Prob:  ", prob    return probif __name__ == '__main__':    A = np.array([[0.5, 0.2, 0.3],                  [0.3, 0.5, 0.2],                  [0.2, 0.3, 0.5]])    B = np.array([[0.5, 0.5],                  [0.4, 0.6],                  [0.7, 0.3]])    pi = np.array([0.2, 0.4, 0.4])    model = (A, B, pi)    Observe = np.array([0, 1, 0])    States = np.array([1, 2, 3])    forward_prob(model,Observe,States)    backward_prob(model, Observe, States)

实验结果:

这里写图片描述

0 0
原创粉丝点击