隐马尔可夫模型的前向算法和后向算法理解与实现(Python)

前言

~~~~~隐马尔可夫模型(HMM)是可用于标注问题的统计学习模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型。

马尔可夫模型理论与分析

~~~~~参考《统计学习方法》这本书,书上已经讲得很详细,本文只是想详细分析一下前向算法和后向算法,加深对算法的理解,并希望能帮助到他人。

前向算法理论分析

定义

~~~~~

前向算法的定义.PNG

定义解析:由于每个状态生成一个观测变量,那么在t时刻就会生成t个观测变量,在t时刻处于状态i的概率就是前向概率。

前向算法

算法1.PNG

算法2.PNG

~~~~~在分析算法之前,先介绍一下隐马尔可夫模型的两个基本假设,后面分析算法会用到这两个假设。

两个基本假设.PNG

~~~~~下面就简要分析一下前向算法各个步骤表示的意思,只有理解了算法各步骤的意思才能写出代码。

~~~~~算法的目的:根据初始参数和观测序列求出观测序列概率

~~~~~步骤(1)初始值:

~~~~~首先我们假设i = 1的情况,后面的解析依旧采用这样的方法,先假设一种状态,再推广到全部的状态。假设i = 1,则右边表达式的意思依次是,t = 1时刻处于状态1的概率 * 观测变量1的概率 = t = 1时刻状态1生成观测变量1的概率。推广到i = 1,2,3,...,N则整个表达式的意思是:t = 1时刻1~N个状态分别生成观测变量1的概率。

~~~~~步骤(2)递推:

~~~~~这里表达式很复杂,分析表达式的意思时,可以先从最里面的求和开始分析,再分析外面的,由内而外的分析思路比较清晰。既然从最里面的求和表达式分析,那么假设t和i不变j = 1时的情况。

~~~~~当j = 1则公式(10.16)表达式依次表示的意思是,t时刻状态1生成观测变量1的概率 * 状态1到状态i的转移概率 * t + 1时刻状态i下生成观测变量t + 1的概率 = t时刻的状态1转移到t + 1时刻状态i生成观测变量t+1的概率。这里用到了基本假设1,计算t + 1时刻的观测变量概率只依赖于t时刻的状态,与其他状态无关。那么当j = 1,2,3,4,...,N求和时,右边表达式表示意思:t时刻的状态转移到t+1时刻状态i生成观测变量t + 1的概率。

~~~~~如果想要求出在t时刻的状态转移到t + 1时刻N个状态生成观测变量t+1的概率。那么式子(10.16)处于对i = 1,2,3,...,N的循环下。

~~~~~如果想要求出在T时刻状态i = 1,2,3,4,...,N分别生成观测变量T的概率,那么式子(10.16)最外面再套一个循环t = 1,2,3,....,T - 1。

~~~~~步骤(3)终止:

~~~~~T时刻对N个状态生成观测变量T的概率求和,表示T时刻观测变量T的概率。

前向算法代码

#隐马尔科链模型前向算法
def hmm_forward(A, PI, B, O):
    M = shape(PI)[0]   #观测序列大小
    N = shape(A)[1]    #状态序列大小
    T = M   
    alpha = mat(zeros((M, N)))
    P = 0.0

    for i in range(N):  
        alpha[0, i] = PI[i, 0] * B[i, 0]

    for t in range(T - 1):
        for i in range(N):
            temp_value = 0.0;
            for j in range(N):
                temp_value += alpha[t, j] * A[j, i]
            index = 0
            if(O[t + 1, 0] == 0):
                index = 0
            else:
                index = 1
            alpha[t + 1, i] = temp_value * B[i, index]  
    for i in range(N):
        P += alpha[T - 1, i]
    return P,alpha

~~~~~只要对照我的前向算法分析就能看懂代码,并且知道我为什么会那样写。

后向算法理论分析

定义

后向算法定义.PNG

~~~~~这个定义比较好懂,就不解析了。

后向算法

算法3.PNG

~~~~~后向算法就不详细分析了,按照我分析前向算法的思路取分析就可清楚的理解每一个步骤代表的意思。

后向算法代码

#隐马尔科链模型后向算法
def hmm_backword(A, PI, B, O):
    T,N = shape(A)
    beta = mat(zeros((T, N)))
    P = 0.0

    beta[T - 1, :] = 1
    t = T - 2
    while t >= 0:
        for i in range(N):
            temp_value = 0.0
            for j in range(N):
                index = 0
                if(O[t + 1, 0] == 0):
                    index = 0
                else:
                    index = 1
                temp_value += A[i, j] * B[j, index] * beta[t + 1, j]
            beta[t, i] = temp_value
        t -= 1

    for i in range(N):
        index = 0
        if(O[0, 0] == 0):
            index = 0
        else:
            index = 1
        P += PI[i, 0] * B[i, index] * beta[0, i]
    return P,beta

完整代码如下

from numpy import *
import numpy as np
import matplotlib as plt
import math

#隐马尔科链模型前向算法
def hmm_forward(A, PI, B, O):
    M = shape(PI)[0]   #观测序列大小
    N = shape(A)[1]    #状态序列大小
    T = M   
    alpha = mat(zeros((M, N)))
    P = 0.0

    for i in range(N):  
        alpha[0, i] = PI[i, 0] * B[i, 0]

    for t in range(T - 1):
        for i in range(N):
            temp_value = 0.0;
            for j in range(N):
                temp_value += alpha[t, j] * A[j, i]
            index = 0
            if(O[t + 1, 0] == 0):
                index = 0
            else:
                index = 1
            alpha[t + 1, i] = temp_value * B[i, index]  
    for i in range(N):
        P += alpha[T - 1, i]
    return P,alpha

#隐马尔科链模型后向算法
def hmm_backword(A, PI, B, O):
    T,N = shape(A)
    beta = mat(zeros((T, N)))
    P = 0.0

    beta[T - 1, :] = 1
    t = T - 2
    while t >= 0:
        for i in range(N):
            temp_value = 0.0
            for j in range(N):
                index = 0
                if(O[t + 1, 0] == 0):
                    index = 0
                else:
                    index = 1
                temp_value += A[i, j] * B[j, index] * beta[t + 1, j]
            beta[t, i] = temp_value
        t -= 1

    for i in range(N):
        index = 0
        if(O[0, 0] == 0):
            index = 0
        else:
            index = 1
        P += PI[i, 0] * B[i, index] * beta[0, i]
    return P,beta

if __name__ == "__main__":
    A = mat([[0.5, 0.2, 0.3],
             [0.3, 0.5, 0.2],
             [0.2, 0.3, 0.5]])
    B = mat([[0.5, 0.5],
             [0.4, 0.6],
             [0.7, 0.3]])
    PI = mat([[0.2],
              [0.4],
              [0.4]])
    #红,白,红
    O = mat([[0],
             [1],
             [0]])

    P,alpha = hmm_forward(A, PI, B, O)
    print(P)
    print("--------------------------------------")
    P,beta = hmm_backword(A, PI, B, O)
    print(P)

输入数据

~~~~~和《统计学习方法》这本书上的输入数据一样

    A = mat([[0.5, 0.2, 0.3],
             [0.3, 0.5, 0.2],
             [0.2, 0.3, 0.5]])
    B = mat([[0.5, 0.5],
             [0.4, 0.6],
             [0.7, 0.3]])
    PI = mat([[0.2],
              [0.4],
              [0.4]])
    O = mat([[0],
             [1],
             [0]])
输入数据.PNG

输出结果

~~~~~本问前向算法和后向算法的输出结果

输出结果.PNG

~~~~~《统计学习方法》这本书上的输出结果

书上的输出结果.PNG

结果分析

~~~~~由以上输出结果可知,本文的输出结果与书上的输出结果一致,且前向算法和后向算法的输出结果也一致,则本文的前向算法与后向算法完全正确。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • Visual Studio Code(简称VS Code)是微软开发的文本编辑器,同时支持Windows、Linu...
    产品看世界阅读 25,652评论 3 17
  • 有人说,我和我老婆很像沈复和芸娘,平和交流,嘻戏探怀,甚是简单。同桌之缘,已有十六载。一日,我逗气了她,其用书敲我...
    静谧为守阅读 149评论 0 0
  • 很多朋友定义我为“人生赢家” 有点夸张,灰常高调,仔细回想,只是之前自己暗暗定下的目标正一步步实现着:有对可爱的建...
    泡泡侯阅读 371评论 0 0
  • 你不能否定我,因为我可以! 作为一位职业教育从业者,见过形形色色的人生,来我这儿参加培训的学员,绝大部分身上有个标...
    艾飞看世界阅读 380评论 0 0