HMM简介: Hidden Markov Model(HMM)是个统计模型. 创立于20世纪7,8十年代, 现在已经成功应用与语音识别, 行为识别, 文字识别等领域. 两个人交流时的过程是这样的[4]: 发送者(人或者机器)对信息进行编码(编码成语音或者电话线的调制信号), 通过媒体(空气, 电线)传播到接收方(这个过程称为信道传输); 在接收方, 接受者(人或者机器) 根据事先约定好的方法(比如我们知道英语good代表好的意思, 我们的大脑对good这个词进行解码), 对信息进行解码.
wiki例子[1]: Alice和Bob是好朋友, 但是两人距离较远, 每天通过电话了解对方做了什么. Bob对3种活动感兴趣: 公园散步, 购物, 清理房间, Bob选择干什么事情仅与当天的天气有关. Alice对于Bob所在城市的天气并不是很了解, 但是了解Bob城市天气的总的趋势. 每天Bob告诉Alice自己干了什么, Alice要从这些信息中去猜测Bob所在城市的天气情况, 请问如何做?
Alice的做法是这样的, 他认为每天天气的转变就像是一个马尔科夫链, 有两个状态: “雨天”, “晴天”. 但是无法直接观察到. 每天, Bob都有一定的概率去散步,购物或者打扫(只干这3件事), Bob会告诉Alice自己的活动, 这些活动就是Alice的间接观测数据, 通过这些观测数据去推测当天天气情况, 这整个系统就是一个HMM.
// HMM模型参数W
// 状态数目: 雨天, 晴天 (下面代码基于python)
states = ('Rainy', 'Sunny')
observation = ('Walk','Shop','Clean') // 每个状态可能的观测值(Bob的行为)
start_probability = {
'Rainy': 0.6,'Sunny': 0.4} // 每种状态的初始概率分布
// 状态转移概率,比如今天是Rainy,明天是Rainy的概率是0.7, 是Sunny的概率是0.3
transition_probability={
'Rainy': {
'Rainy': 0.7, 'Sunny': 0.3},'Sunny':{
'Rainy': 0.7, 'Sunny': 0.3}}
// 给定状态下,观测值的概率分布, 比如Bob在Rainy天Walk的概率是0.1
emission_probability={
'Rainy',{
'Walk',0.1, 'Shop':0.4, 'Clean': 0.5},'Sunny',{
'Walk',0.6, 'Shop':0.3, 'Clean': 0.1}}
解释以及问题提出:
这里,start_probability可以从一年中Rainy/Sunny的天数统计而来. Alice和Bob通话的3天里, Bob告诉Alice他这3天做的事是: 散步, 购物, 清理. Alice现在有2个问题:
1) 这个观察序列O=(‘散步’,’购物’,’清理’)的出现概率是多少? (即求: P(O|W) )?
2) 如何通过观察序列推测最可能的状态序列? (根据W和O, 如何求状态序列S?)
状态转移图和发射图如下图所示:
数学表达:
如何根据观测值 o1,o2,o3... 来推测信号源发送的信息 s1,s2,s3,... 呢? 用概率的角度就是最大化下式: