Machine Learning--隐马尔科夫(HMM)讲解

来源:互联网 发布:多益网络在线笔试 编辑:程序博客网 时间:2024/06/03 17:04

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.3transition_probability={'Rainy': {'Rainy': 0.7, 'Sunny': 0.3},'Sunny':{'Rainy': 0.7, 'Sunny': 0.3}}// 给定状态下,观测值的概率分布, 比如Bob在Rainy天Walk的概率是0.1emission_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,... 呢? 用概率的角度就是最大化下式:

P(s1,s2,s3,...|o1,o2,o3,...)=P(o1,o2,o3,...|s1,s2,s3,...)P(s1,s2,s3,...)P(o1,o2,o3,...)  (1)

s1,s2,s3,...=argmaxalls1,s2,...P(s1,s2,s3,...|o1,o2,o3,...)  (2)

s1,s2,... 是我们未知的,o1,o2,... 是我们已知的, 我们的目的是通过已知推测未知, 在已知序列的情况下, 找到一个未知序列使它出现的概率最大. 由于o1,o2,... 已知, 因此第一式中的分母是个可以忽略的常数, 我们不再理会它, 而知关心分子. P(s1,s2,...) 是信号源状态为s1,s2,... 的可能性, P(o1,o2,o3,...|s1,s2,s3,...) 是在信号s1,s2,... 作用下出现观测序列o1,o2,... 的概率. 马尔科夫为了简化问题, 提出一种简化的假设:

随机过程中各个状态st 的概率分布, 只与它前一个状态有关, 即 P(s1|s2,s3,...)=P(s1|s2).

P(s1,s2,s3,...sn)=P(s1|s2,s3,...)P(s2,s3,...)=P(s1|s2)P(s2|s3,...)P(s3,...)=tP(st|st1)(3)

P(s1,s2,s3,...,o1,o2,o3,...)=tP(st|st1)P(ot|st)  (4)

P(o1,o2,o3,...|s1,s2,s3,...)=tP(ot|st)  (5)

问题1 HMM的训练:
从上式我们可以知道, 我们只需要知道P(st|st1) (状态转移概率)和 P(ot|st) (生成概率) 就能从给定的输出序列推测信号源序列, 这一过程称为模型的训练, 转移概率和生成概率成为模型的参数(和朴素贝叶斯相似).

P(ot|st)=P(ot,st)P(st)sum(ot,st)sum(st)  (6)

如果有足够多的训练样本, 我们可以统计st 出现的次数(记为sum(st)), 和(ot,st) 同时出现的次数, 记为sum(ot,st). 这些都是可以通过训练样本统计出来的, 和朴素贝叶斯很相似.

P(st|st1)=P(st1,st)p(st1)sum(st1,st))sum(st1)  (7)

这个和前面的相似, 也是可以直接通过训练样本统计得到的.

训练问题: 这种训练方式需要大量的标记样本, 这点很困难, 成本很高
实用的训练方法:
我们采用无监督的方法, 即通过大量观测到的信号o1,o2,o3,... 无监督地来推测P(st|st1)P(ot|st), 有这样的方法吗? 有: 鲍姆-韦尔奇算法.
鲍姆-韦尔奇算法思想:
两个不同的HMM模型可以得到相同的观测序列, 如果仅仅通过观测序列o1,o2,o3,... 来推测HMM参数的话, 可能得到很多合适的模型. 这些模型总有一个比其他的更可能产生观测到的序列, 我们的目的就是找到这个模型.

首先找到一组能够产生观测序列o1,o2,o3,... 的HMM模型参数(如果转移概率和生成概率都是均匀分布的话, 可以产生任何的观测序列), 这个初始的模型设为Mθ0. 我们利用这个模型计算出产生观测序列o1,o2,o3,... 的概率, 并且能够计算这个模型产生其他的序列的概率. 根据这些数据由(6)(7)计算出新的模型参数Mθ1, 这称为是一个迭代(这点还没有理解). 可以证明:

P(o1,o2,o3,...|Mθ0)<P(o1,o2,o3,...|Mθ1)

重复迭代这个过程, 直到模型的质量不再显著提高未知(又是一个EM的过程).

例子2:
考虑一个交通灯的例子, 假设交通灯的状态有4个: red–red/amber–green–amber–red,这个序列是一个状态机, 后一个状态依赖前一个状态, 这是一个确定性的系统. 状态转换图如下所示:

信号灯状态转换图

确定性系统的状态存在简单的依赖关系, 便于理解和分析.

[1] HMM(wiki).
[2] 专门介绍HMM的英文网站.
[3] 隐马尔可夫模型(HMM)攻略.
[4] 数学之美 第五章 隐含马尔科夫模型.

0 0
原创粉丝点击