from:http://www.gooseeker.com/cn/node/Fuller/2010060701
什么是隐马尔科夫模型(HMM)
维基百科对隐马尔可夫模型的定义:
![](https://i-blog.csdnimg.cn/blog_migrate/2f2097b698e67d11c95123015d4be006.png)
隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。
在正常的马尔可夫模型中,状态对于观察者来说是直接可见的。这样状态的转换概率便是全部的参数。 而在隐马尔可夫模型中,状态并不是直接可见的,但受状态影响的某些变量则是可见的。每一个状态在可能输出的符号上都有一概率分布。 因此输出符号的序列能够透露出状态序列的一些信息。
举例
该例子出自维基百科的词条隐马尔可夫模型,wiki上一个比较好的HMM例子对其进一步补充说明。
Alice 和Bob是好朋友,但是他们离得比较远,每天都是通过电话了解对方那天作了什么。Bob仅仅对三种活动感兴趣:公园散步,购物以及清理房间。他选择做什么事情只凭当天天气。Alice对于Bob所住的地方的天气情况并不了解,但是知道总的趋势。在Bob告诉Alice每天所做的事情基础上,Alice想要猜测Bob所在地的天气情况。
Alice认为天气的运行就像一个马尔可夫链。其有两个状态 “雨”和”晴”,但是无法直接观察它们,也就是说,它们对于Alice是隐藏的。每天,Bob有一定的概率进行下列活动:“散步”,“购物”, 或 “清理”。 因为Bob会告诉Alice他的活动,所以这些活动就是Alice的观察数据。这整个系统就是一个隐马尔可夫模型HMM。
Alice知道这个地区的总的天气趋势,并且平时知道Bob会做的事情。也就是说这个隐马尔可夫模型的参数是已知的。可以用程序语言(Python) 写下来:
// 状态数目,两个状态:雨或晴 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}, }
在这些代码中,
- start_probability代表了Alice对于Bob第一次给她打电话时的天气情况的不确定性(Alice知道的只是那个地方平均起来下雨多些)。在这里,这个特定的概率分布并非平衡的,平衡概率应该接近(在给定变迁概率的情况下){‘Rainy’: 0.571, ‘Sunny’: 0.429}。
- transition_probability 表示马尔可夫链下的天气变迁情况,在这个例子中,如果今天下雨,那么明天天晴的概率只有30%。
- 代码emission_probability 表示了Bob每天作某件事的概率。如果下雨,有 50% 的概率他在清理房间;如果天晴,则有60%的概率他在外头散步。
隐马尔可夫模型要回答的三大问题
三大问题分别是:
- 已知HMM模型λ及观察序列O,如何计算P(O|λ)
- 给定观察序列O=O1,O2,…OT以及模型λ,如何选择一个对应的状态序列S = q1,q2,…qT,使得S能够最为合理的解释观察序列O
- 如何调整模型参数,使得P(O|λ)最大。这个问题事实上就是给出很多个观察序列值,来训练以上几个参数的问题
上述例子与两大大问题的对应:Alice和Bob通了三天电话后发现第一天Bob去散步了,第二天他去购物了,第三天他清理房间了。Alice现在有两个问题:
- 这个观察序列“散步、购物、清理”的总的概率是多少?
- 对应于HMM问题1
- 最能解释这个观察序列的状态序列(晴/雨)又是什么?
- 对应于HMM问题2