隐马尔可夫模型及Viterbi算法
隐马尔可夫模型(HMM,hidden Markov model)是可用于标注问题的统计学模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型。HMM模型主要用于语音识别,自然语言处理,生物信息,模式识别等领域。
引入
某天,你的女神告诉你说,她放假三天,将要去上海游玩,准备去欢乐谷、迪士尼和外滩(不一定三个都会去)。
她呢,会选择在这三个地方中的某几个逗留并决定是否购物,而且每天只待在一个地方。根据你对她的了解,知道她去哪个地方,仅取决于她去的上一个地方,且是否购物的概率仅取决于她去的地方。已知她去的三个地方的转移概率表如下:
| 欢乐谷 | 迪士尼 | 外滩 | |
|---|---|---|---|
| 欢乐谷 | 0.8 | 0.05 | 0.15 |
| 迪士尼 | 0.2 | 0.6 | 0.3 |
| 外滩 | 0.2 | 0.3 | 0.5 |
稍微对这个表格做些说明,比如第一行,前一天去了欢乐谷后,第二天还待在欢乐谷的概率为0.8,去迪士尼的概率为0.05,去外滩的概率为0.15。
她在每个地方的购物概率为:
| 地点 | 购物概率 |
|---|---|
| 欢乐谷 | 0.1 |
| 迪士尼 | 0.8 |
| 外滩 | 0.3 |
在出发的时候,她跟你说去每个地方的可能性相同。后来,放假回来后,你看了她的朋友圈,发现她的购物情况如下:第一天不购物,第二三天都购物了。于是,你很好奇,她这三天都去了哪些地方。
怎么样,聪明的你能求解出来吗?
HMM的模型参数
接下来,我们将会介绍隐马尔可夫模型(HMM)。
隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程。隐藏的马尔可夫链随机生成的状态的序列,称为状态序列;每个状态生成一个观测,而由此产生的观测的随机序列,称为观测序列。序列的每一个位置又可以看作是一个时刻。
隐马尔可夫模型由初始概率分布、状态转移概率分布以及观测概率分布确定。隐马尔可夫模型的形式定义如下:
设Q是所有可能的状态的集合,V是所有可能的观测的集合,也就是说,Q是不可见的,而V是可见的,是我们观测到的可能结果。

其中,N是可能的状态数,M是可能的观测数。
在刚才的例子中,Q是不可见的状态集合,应为Q={欢乐谷,迪士尼,外滩},而V是可以观测的集合,应为V={购物,不购物}。
I是长度为T的状态序列,O是对应的观测序列。

在刚才的例子中,I这个序列是我们需要求解的,即女生去了哪些地方,而O是你知道的序列,O={不购物,购物,购物}。
A是状态转移概率矩阵:


N是在时刻t处于状态qi的条件下在时刻t+1转移到状态qj的概率。在刚才的例子中,转移概率矩阵为:

B是观测概率矩阵:


N是在时刻t处于状态qj的条件下生成观测vk的概率。在刚才的例子中:


综上,我们已经讲完HMM中的基本概念。同时,我们可以知道,隐马尔可夫模型由初始状态概率向量π,状态转移概率矩阵A和观测概率矩阵B决定。π和A决定状态序列,B决定观测序列。因此,隐马尔可夫模型λλ可用三元符号表示,即

A,B,π称为HMM的三要素。
当然,隐马尔可夫模型之所以被称为马尔可夫模型,是因为它使用了两个基本的假设,其中之一为马尔可夫假设。它们分别是:
齐次马尔科夫假设,即假设隐藏的马尔可夫链在任意时刻t的状态只依赖于其前一时刻的状态,与其他时刻的状态及观测无关,也与时刻t无关。

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

在刚才的假设中,我们对应的两个假设分别为:她去哪个地方,仅取决于她去的上一个地方;是否购物的概率仅取决于她去的地方。前一个条件为齐次马尔科夫假设,后一个条件为观测独立性假设。
以上,我们就介绍了HMM的基本概念及假设。而HMM的三个基本问题如下:

上面的例子即为HMM的第三个基本问题,也就是,给定观测序列{不购物,购物,购物},结果最有可能的状态序列,即游玩的地方。
Viterbi算法
求解HMM的第三个基本问题,会用到大名鼎鼎的维特比算法(Viterbi Algorithm)。
维特比算法是一个特殊但应用最广的动态规划(dynamic programming)算法,利用动态规划,可以解决任何一个图中的最短路径问题,同时,它也是求解HMM描述的第三个基本问题的算法。


Python代码实现
下面,对于刚才给出的例子,我们将使用Python,来写代码实现Viterbi算法,同时求解刚才的问题。
# -*- coding: utf-8 -*-
# HMM.py
# Using Vertibi algorithm
import numpy as np
def Viterbi(A, B, PI, V, Q, obs):
N = len(Q)
T = len(obs)
delta = np.array([[0] * N] * T, dtype=np.float64)
phi = np.array([[0] * N] * T, dtype=np.int64)
# 初始化
for i in range(N):
delta[0, i] = PI[i]*B[i][V.index(obs[0])]
phi[0, i] = 0
# 递归计算
for i in range(1, T):
for j in range(N):
tmp = [delta[i-1, k]*A[k][j] for k in range(N)]
delta[i,j] = max(tmp) * B[j][V.index(obs[i])]
phi[i,j] = tmp.index(max(tmp))
# 最终的概率及节点
P = max(delta[T-1, :])
I = int(np.argmax(delta[T-1, :]))
# 最优路径path
path = [I]
for i in reversed(range(1, T)):
end = path[-1]
path.append(phi[i, end])
hidden_states = [Q[i] for i in reversed(path)]
return P, hidden_states
def main():
# 状态集合
Q = ('欢乐谷', '迪士尼', '外滩')
# 观测集合
V = ['购物', '不购物']
# 转移概率: Q -> Q
A = [[0.8, 0.05, 0.15],
[0.2, 0.6, 0.2],
[0.2, 0.3, 0.5]
]
# 发射概率, Q -> V
B = [[0.1, 0.9],
[0.8, 0.2],
[0.3, 0.7]
]
# 初始概率
PI = [1/3, 1/3, 1/3]
# 观测序列
obs = ['不购物', '购物', '购物']
P, hidden_states = Viterbi(A,B,PI,V,Q,obs)
print('最大的概率为: %.5f.'%P)
print('隐藏序列为:%s.'%hidden_states)
main()
输出结果如下:
最大的概率为: 0.02688.
隐藏序列为:['外滩', '迪士尼', '迪士尼'].
现在,你有很大的把握可以确定,你的女神去了外滩和迪士尼。
隐马尔可夫模型及Viterbi算法的更多相关文章
- 隐马尔科夫模型及Viterbi算法的应用
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4335810.html 一个例子: 韦小宝使用骰子进行游戏,他有两种骰子一种正常的骰子,还有一 ...
- HMM:隐马尔科夫模型-前向算法
http://blog.csdn.net/pipisorry/article/details/50722376 目标-解决HMM的基本问题之一:已知HMM模型λ及观察序列O,如何计算P(O|λ)(计算 ...
- HMM:隐马尔科夫模型-维特比算法
http://blog.csdn.net/pipisorry/article/details/50731584 目标-解决HMM的基本问题之二:给定观察序列O=O1,O2,-OT以及模型λ,如何选择一 ...
- 隐马尔可夫模型(HMM)及Viterbi算法
HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引 ...
- Viterbi算法和隐马尔可夫模型(HMM)算法
隐马尔可夫模型(HMM)及Viterbi算法 https://www.cnblogs.com/jclian91/p/9954878.html HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那 ...
- 隐马尔可夫模型(HMM)及Viterbi算法
HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳.那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑. 本文将通过具体形象的例子来引入该模型 ...
- 隐马尔科夫模型(HMM)的概念
定义隐马尔科夫模型可以用一个三元组(π,A,B)来定义:π 表示初始状态概率的向量A =(aij)(隐藏状态的)转移矩阵 P(Xit|Xj(t-1)) t-1时刻是j而t时刻是i的概率B =(bij) ...
- 隐马尔科夫模型(Hidden Markov Models)
链接汇总 http://www.csie.ntnu.edu.tw/~u91029/HiddenMarkovModel.html 演算法笔记 http://read.pudn.com/downloads ...
- 隐马尔科夫模型(Hidden Markov Models) 系列之三
转自:http://blog.csdn.net/eaglex/article/details/6418219 隐马尔科夫模型(Hidden Markov Models) 定义 隐马尔科夫模型可以用一个 ...
随机推荐
- PageBarHelper分页显示类
一共有两个分页类,都可以使用(单独使用) using System;using System.Collections.Generic;using System.Linq;using System.Te ...
- mysql TIMESTAMP 不能为NULL
一般建表时候,创建时间用datetime,更新时间用timestamp.这是非常重要的. 我测试了一下,如果你的表中有两个timestamp字段,只要你更新任何非timestamp字段的值,则第一个t ...
- string字符串 获取指定位置范围的子字符串
string str1="12345678"; str1.Substring(0,4);其中0表示要取得字符串的起始位置,4就是要取得字符串的长度 结果是 "1 ...
- 百度ueditor解决页面组件被覆盖问题
本文不再更新,可能存在内容过时的情况,实时更新请移步原文地址:百度ueditor解决页面组件被覆盖问题: 在使用ueditor的过程中,会出现表单组件被ueditor覆盖的问题,解决的方式如下: ue ...
- [转]使用RDLC报表
使用RDLC报表(一) 1 建立数据源 启动VS2005新建一个窗体项目,命名为TestProj 在左边的窗体内选择“添加新数据源”或在菜单上操作“添加新数据源”: 选择后出现对话窗体,选 ...
- angularjs中动态为audio绑定src问题总结
先上代码 <div class="block_area block_audio" ng-show="model.url"> <audio co ...
- Android实战技巧之四十一:制作自己的Android SDK
标签: sdkandroid定制sdk 2015-09-21 18:05 11237人阅读 评论(2) 收藏 举报 分类: Android(260) 版权声明:本文为博主原创文章,未经博主允许 ...
- Spring MVC(二)--Spring MVC登陆实例
本文通过一个简单的登陆实例实现Spring MVC的流程,同时整合 MyBatis使用,流程是这样的: 1.访问一个URL进入登陆界面 2.输入正确的用户名和密码,成功则进入index页面,否则留在登 ...
- Mysql指定部分数据同步
一.需求背景 朋友的公司需要每天定时从源端定时同步一部分数据到目标端,库中存在company_id列的表,只将指定的company_id列导入到目标端数据库:存在company_id列的表,将表中所有 ...
- Web Service和WCF的区别
[1]Web Service:严格来说是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架,也不是技术. 它有一套完成的规范体系标准,而且在持续不断的更新完善中. 它使用XM ...