HMM算法-解码问题

这篇文章记录一下解决HMM三大问题的第二个问题的学习过程。回忆一下,第二个问题是什么来着?给定HMM模型\(lambda\)和观测序列O,求产生这个观测序列概率最大的状态序列是什么?把这个问题叫做解码问题,也是挺贴切的~

求解这个问题,有一个经典的算法,叫做Viterbi算法。Viterbi是个了不起的人物,数学之美第26就是讲Viterbi和他的Viterbi算法。

Viterbi算法针对篱笆网络有向图(Lattice)的最短路径问题提出,是一个特殊但是应用最广泛的动态规划算法。凡是使用HMM的问题都可以用它来解码,包括数字通信、语音识别、机器翻译、拼音转汉字、分词等。

Viterbi算法类似求解观测序列概率时使用的forward方法,它也定义了一个变量:

\(\delta=\displaystyle\max_{q_1...q_{t-1}}P(q_1q_2...q_t=s_i,O_1O_2..O_t|\lambda)\)。

这是t时刻状态\(q_t=s_i\)时的最优状态序列和前t个观察序列的联合概率。\(\delta_i(t)\)和\(\delta_j(t+1)\)的关系是:

\(\delta_j(t+1)=[\displaystyle\max_{1 \leq i \leq N}\delta_i(t)a_{ij}]b_j(O_{t+1})\)

这个和forward方法非常的类似,forward方法是从t转移到t+1时的所有N个可能的概率加和,而vebiter是这N个状态的求最大。

整个解码过程可以概括为:

虽然现在看来维特比算法并不是很复杂,但是当时提出来可是一件非常了不起的事!有些真理就是一旦发现就是如此简单,但是发现它,可能要穷尽几代人的努力。

下面用viterbi解决一个小的问题,问题是这样的:假设手里有三个不同的骰子。第一个骰子是我们平常见的骰子(称这个骰子为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 。现在求每次抛出去的是哪个骰子?

python 代码如下

def verbiter(S,K,A,B,pi,Obv):
    ‘‘‘
    求解出现Obv概率最大的状态序列
    :param S: array,状态符号集合
    :param K: array,观测符号集合
    :param A: matrix,转移矩阵
    :param B: matrix,发射矩阵
    :param pi: 初始矩阵
    :param Obv: 观测序列
    :return: 状态序列
    ‘‘‘
    N = len(S)
    M = len(K)
    Delta = []
    #初始化
    start_node = K.index(Obv[0])
    fst_row = [{"prob":pi[i]*B[i][start_node],"pre_node":-1} for i in range(0,N)]
    Delta.append(fst_row)

    for t in range(1,M):
        row = []
        for j in range(0,N):
            ob = K.index(Obv[t])
            ob_prop = B[j][ob]
            trans = [Delta[t-1][i]["prob"]*A[i][j] for i in range(0,N)]
            maxindex, maxvalue = max(enumerate(trans), key=lambda x: x[1])
            row.append({"prob":maxvalue*ob_prop,"pre_node":maxindex})
        Delta.append(row)

    #T时刻最大概率状态
    max_s,max_prob = max(enumerate(Delta[M-1]),key=lambda x:x[1]["prob"])

    #最优路径
    cur_node = max_s
    path = [max_s]
    for t in range(M-1,1,-1):
        pre_node = Delta[t][cur_node]["pre_node"]
        path.append(pre_node)
        cur_node = pre_node

    path.reverse()
    print ‘,‘.join(S[i] for i in path)
    print max_prob["prob"]

if __name__ == "__main__":
    S = ["D6","D4","D8"]
    K = [1,2,3,4,5,6,7,8]
    A = [[1/3.0,1/3.0,1/3.0],
         [1/3.0,1/3.0,1/3.0],
         [1/3.0,1/3.0,1/3.0]]
    B = [[1/6.0,1/6.0,1/6.0,1/6.0,1/6.0,1/6.0,0,0],
         [1/4.0,1/4.0,1/4.0,1/4.0,0,0,0,0],
         [1/8.0,1/8.0,1/8.0,1/8.0,1/8.0,1/8.0,1/8.0,1/8.0]]
    pi = [1/3.0,1/3.0,1/3.0]
    Obv = [1,6,3,5,2,7,3,5,2,4]
    verbiter(S,K,A,B,pi,Obv)
时间: 2024-08-03 09:23:10

HMM算法-解码问题的相关文章

语音识别之HMM算法及其源码

基础 [1]了解HMM算法:http://www.cnblogs.com/pangxiaodong/archive/2011/10/17/2214542.html [2]再次加深印象:http://blog.csdn.net/likelet/article/details/7056068 [3]一次综述:http://baike.baidu.com/link?url=1ajOQ5jh8lm2j234DeMJE1dA0b9N9mmGb6wFw5_-_vAlD15-PHjAg17Swm9Rr_CD9

HMM算法(生成模型+无监督学习)-->扩展CRF

隐含马尔可夫模型并不是俄罗斯数学家马尔可夫发明的,而是美国数学家鲍姆提出的,隐含马尔可夫模型的训练方法(鲍姆-韦尔奇算法)也是以他名字命名的.隐含马尔可夫模型一直被认为是解决大多数自然语言处理问题最为快速.有效的方法. 现实世界中有一类问题具有明显的时序性,比如路口红绿灯.连续几天的天气变化,我们说话的上下文,HMM的基础假设就是,一个连续的时间序列事件,它的状态受且仅受它前面的N个事件决定,对应的时间序列可以成为N阶马尔可夫链. 假设今天是否有雾霾只由前天和昨天决定,于是就构成了一个2阶马尔可

隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数

隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列(TODO) 在本篇我们会讨论HMM模型参数求解的问题,这个问题在HMM三个问题里算是最复杂的.在研究这个问题之前,建议先阅读这个系列的前两篇以熟悉HMM模型和HMM的前向后向算法,以及EM算法原理总结,这些在本篇里会用到.在李航的<统计学习方法>中,这个算法的讲解只考虑了单个观测

隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率

隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列(TODO) 在隐马尔科夫模型HMM(一)HMM模型中,我们讲到了HMM模型的基础知识和HMM的三个基本问题,本篇我们就关注于HMM第一个基本问题的解决方法,即已知模型和观测序列,求观测序列出现的概率. 1. 回顾HMM问题一:求观测序列的概率 首先我们回顾下HMM模型的问题一.这个

从决策树学习谈到贝叶斯分类算法、EM、HMM

从决策树学习谈到贝叶斯分类算法.EM.HMM 引言 近期在面试中,除了基础 &  算法 & 项目之外,经常被问到或被要求介绍和描写叙述下自己所知道的几种分类或聚类算法(当然,这全然不代表你将来的面试中会遇到此类问题,仅仅是由于我的简历上写了句:熟悉常见的聚类 & 分类算法而已),而我向来恨对一个东西仅仅知其皮毛而不得深入,故写一个有关数据挖掘十大算法的系列文章以作为自己备试之用,甚至以备将来经常回想思考.行文杂乱,但侥幸若能对读者起到一点帮助,则幸甚至哉. 本文借鉴和參考了两本书,

从决策树学习谈到贝叶斯分类算法、EM、HMM --别人的,拷来看看

从决策树学习谈到贝叶斯分类算法.EM.HMM 引言 最近在面试中,除了基础 &  算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法(当然,这完全不代表你将来的面试中会遇到此类问题,只是因为我的简历上写了句:熟悉常见的聚类 & 分类算法而已),而我向来恨对一个东西只知其皮毛而不得深入,故写一个有关数据挖掘十大算法的系列文章以作为自己备试之用,甚至以备将来常常回顾思考.行文杂乱,但侥幸若能对读者起到一点帮助,则幸甚至哉. 本文借鉴和参考了两本书,一本是T

HMM - (补充) 参数求解之 F/B 算法细节

回顾 上篇通过EM算法思想来求解 HMM 的参数 \(\theta=(\pi, A,B)\) 即 初始状态概率(向量), 状态转移概率(矩阵), 发射概率矩阵. 在上帝视角, 即已知隐变量 Z , 则通过简单的词频统计, 再归一化 就求解参数了. 而问题在于我们不是上帝, 只能通过观测值 X , 通过 F/B 算法 来求解出 Z, 即: \(p(z_k|x) = \frac {p(z_k, x)}{p(x)}\) 这是求解目标 这里的 x 表示所有的 n 个样本嘛, 因此为了和 F, B 产生联

HMM MEMM &amp; label bias

(http://blog.csdn.net/xum2008/article/details/38147425) 隐马尔科夫模型(HMM): 图1. 隐马尔科夫模型 隐马尔科夫模型的缺点: 1.HMM只依赖于每一个状态和它对应的观察对象: 序列标注问题不仅和单个词相关,而且和观察序列的长度,单词的上下文,等等相关. 2.目标函数和预测目标函数不匹配: HMM学到的是状态和观察序列的联合分布P(Y,X),而预测问题中,我们需要的是条件概率P(Y|X). 最大熵隐马尔科夫模型(MEMM): 图2. 最

标记偏置 隐马尔科夫 最大熵马尔科夫 HMM MEMM

隐马尔科夫模型(HMM): 图1. 隐马尔科夫模型 隐马尔科夫模型的缺点: 1.HMM只依赖于每一个状态和它对应的观察对象: 序列标注问题不仅和单个词相关,而且和观察序列的长度,单词的上下文,等等相关. 2.目标函数和预测目标函数不匹配: HMM学到的是状态和观察序列的联合分布P(Y,X),而预测问题中,我们需要的是条件概率P(Y|X). 最大熵隐马尔科夫模型(MEMM): 图2. 最大熵马尔科夫模型 MEMM考虑到相邻状态之间依赖关系,且考虑整个观察序列,因此MEMM的表达能力更强:MEMM不