HMM——求隐藏序列,维特比算法求解
2017-09-04 00:00
295 查看
摘要: 求隐藏序列是三个经典问题中的一个,其他两个为已知观察序列求最大概率以及求隐藏状态参数。
states = ('Rainy', 'Sunny')
显性状态
observations = ('walk', 'shop', 'clean')
初试状态概率(隐含态)
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
转换状态
transition_probability = {
'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
}
发射状态(对应隐含状态为显性状态概率)
emission_probability = {
'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}
需要注意
隐性状态的转移必须满足马尔可夫性。(状态转移的马尔可夫性:一个状态只与前一个状态有关)
隐性状态必须能够大概被估计。在满足条件的情况下,确定问题中的隐性状态是什么,隐性状态的表现可能又有哪些.HMM适用于的问题在于,真正的状态(隐态)难以被估计,而状态与状态之间又存在联系。
情景假设
一个东京的朋友每天根据天气{下雨,天晴}决定当天的活动{公园散步,购物,清理房间}中的一种,我每天只能在twitter上看到她发的推“啊,我前天公园散步、昨天购物、今天清理房间了!”,那么我可以根据她发的推特推断东京这三天的天气。在这个例子里,显状态是活动即购物,散步以及整理,隐状态是天气。我们要求出活动对应得天气情况。条件描述
隐含状态states = ('Rainy', 'Sunny')
显性状态
observations = ('walk', 'shop', 'clean')
初试状态概率(隐含态)
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
转换状态
transition_probability = {
'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
}
发射状态(对应隐含状态为显性状态概率)
emission_probability = {
'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}
states = ('Rainy', 'Sunny') observations = ('walk', 'shop', 'clean') start_probability = {'Rainy': 0.6, 'Sunny': 0.4} transition_probability = { 'Rainy': {'Rainy': 0.7, 'Sunny': 0.3}, 'Sunny': {'Rainy': 0.4, 'Sunny': 0.6}, } emission_probability = { 'Rainy': {'walk': 0.1, 'shop': 0.4, 'clean': 0.5}, 'Sunny': {'walk': 0.6, 'shop': 0.3, 'clean': 0.1}, } # 打印路径概率表 def print_dptable(V): print " ", for i in range(len(V)): print "%7d" % i, print for y in V[0].keys(): print "%.5s: " % y, for t in range(len(V)): print "%.7s" % ("%f" % V[t][y]), print def viterbi(obs, states, start_p, trans_p, emit_p): """ :param obs:观测序列 :param states:隐状态 :param start_p:初始概率(隐状态) :param trans_p:转移概率(隐状态) :param emit_p: 发射概率 (隐状态表现为显状态的概率) :return: """ # 路径概率表 V[时间][隐状态] = 概率 V = [{}] # 一个中间变量,代表当前状态是哪个隐状态 path = {} # 初始化初始状态 (t == 0) for y in states: V[0][y] = start_p[y] * emit_p[y][obs[0]] path[y] = [y] # 对 t > 0 跑一遍维特比算法 for t in range(1, len(obs)): V.append({}) newpath = {} for y in states: # 概率 隐状态 = 前状态是y0的概率 * y0转移到y的概率 * y表现为当前状态的概率 (prob, state) = max([(V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states]) # 记录最大概率 V[t][y] = prob # 记录路径 newpath[y] = path[state] + [y] # 不需要保留旧路径 path = newpath print path #print_dptable(V) (prob, state) = max([(V[len(obs) - 1][y], y) for y in states]) return (prob, path[state]) def example(): return viterbi(observations, states, start_probability, transition_probability, emission_probability) print example()
需要注意
隐性状态的转移必须满足马尔可夫性。(状态转移的马尔可夫性:一个状态只与前一个状态有关)
隐性状态必须能够大概被估计。在满足条件的情况下,确定问题中的隐性状态是什么,隐性状态的表现可能又有哪些.HMM适用于的问题在于,真正的状态(隐态)难以被估计,而状态与状态之间又存在联系。
本文转自以下博主
原博主博客相关文章推荐
- 维特比算法——寻找最可能的隐藏状态序列
- 基于机器学习的web异常检测——基于HMM的状态序列建模,将原始数据转化为状态机表示,然后求解概率判断异常与否
- 机器学习笔记(十五)——HMM序列问题和维特比算法
- 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列
- HMM求解观察序列概率的"前向算法"伪代码实现
- HMM求解观察序列概率的"前向算法"伪代码实现
- HMM-维特比算法原理和实现
- 最长递增子序列问题的求解(LIS)
- 求解最大子序列、最长递增子序列、最长公共子串、最长公共子序列
- 最大连续子序列的四种求解方法
- 动态规划求解最大连续子序列和
- 如何求解最大连续子序列的和
- 自然语言处理2-隐马尔科夫模型(HMM)-forward algorithm(前向算法)和Viterbi(维特比算法)
- 已知二叉树的中序和前序序列(或后序)求解树
- 最大子序列和问题求解 algorithm 1 O(N^3)
- 算法设计与分析——动态规划方法求解序列的连续最大子段
- 语音信号的短时自相关序列求解以及xcorr与autocorr问题
- 最长升序列求解(OJ 1093)
- 使用分治思想求解最大子序列
- 最大子序列的三种求解方式