HMM(Hidden Markov Model)隐马尔科夫模型,是一个非常实用的模型。要理解什么是隐马尔可夫模型,首先要理解什么是马尔科夫模型。
马尔科夫模型很简单,它的描述是这样子的:
假设一个序列中的某个值,只和它前面的 n 个值有关,与其他值无关。
其实很容易理解,例如天气,今天的天气,只和昨天的天气有关,与前天的天气无关,那么这就是一个马尔科夫过程,n 等于 1。
例如:晴天 -> 雨天 的概率是 0.4,雨天 -> 晴天 的概率是 0.3,连续三天的天气: [ 晴天, 雨天, 雨天 ] 就是一个马尔科夫过程,这个过程出现的概率是
晴天出现的概率
*
晴天 -> 雨天 的概率
*
雨天 -> 雨天 的概率
。
那么什么是隐马尔科夫过程呢?所谓隐马尔科夫过程,里面除了包含一个马尔科夫过程,还包含了一个显示层,马尔可夫过程中出现的值,按照固定概率地决定了显示层出现的值,如下图所示:
公园散步
外出购物
打扫房间
^ ^ ^
| | |
晴天
–>
雨天
–>
雨天
例如:天气的状态是一个马尔科夫过程,那么某个人的日常活动,就是一个显示层,如果天气是晴天,就出去公园散步(50%的概率)或者外出购物(40%的概率),很少去打扫房间的卫生(10%)。如果天气是雨天,就留在家里打扫卫生(50%)或者外出购物(40%),很少出去公园散步(10%),
这个就是隐马尔科夫模型了。
讲解隐马尔科夫原理原理的文章已经很多,这里就不讨论原理,咱们主要看看这个模型如何使用。
案例一:
一个异地的朋友,每天会根据天气 { 下雨, 天晴 },决定当天的活动 { 公园散步, 外出购物, 清理房间 } 。连续三天,她发的朋友圈内容如下:
天气好好,出去公园散步了
缺吃缺喝,去超市购物咯
房间好乱,要清理房间了!
那么,能否根据这些状态,判断出当地三天的天气情况呢?答案是可以的,
隐马尔科夫模型就可以解决这个问题,
我们来看看怎么做。
要解决这个问题,我们先要收集一些数据:
一、确定隐含状态和初始概率
所谓的隐含状态,就是未知的状态,也就是要求解的状态。在这个问题中,就是天气,从题目中可以知道,天气总共有两种状态,不是下雨,就是天晴。
states = {
下雨, 天晴
}
所谓的初始概率,就是隐含状态中,每个状态出现的概率。这里的隐含状态是天气,那么我们可以根据该地区历史的天气情况,分别统计出一年中,下雨的天数是多少,天晴的天数是多少,除以一年365(或者366)天,即可得到下雨的概率和天晴的概率是多少了,假设如下:
startprob = { 0.3, 0.7 }
二、确定隐含状态的转移概率
转移概率是指隐含状态之间转移的概率。这里的隐含状态只有两个——下雨和天晴,那么转移概率有:
下雨 -> 天晴 概率:0.3
天晴 -> 下雨 概率:0.4
只有这两种吗?肯定不止,还有以下两种情况:
下雨 ->
下雨
概率:0.7
天晴 ->
天晴
概率:0.6
这个数据也可以根据去年的所有天气中,前一天和后一天的状态转换,把它们计算出来。
一般我们使用一个矩阵来表达,所以也叫隐含状态的概率转移矩阵:
下雨 天晴
下雨 0.7 0.3
天晴 0.4 0.6
————
本文由
大数据分析实战
撰写,大家可
用手长按识别下方二维码
关注微信订阅号“
数据分析实战
”
三、确定显示状态
所谓的显示状态,就是已知的状态,也就是我们看到的状态,这里有三个,分别是 公园散步、外出购物、清理房间
obs = {
公园散步, 外出购物, 清理房间
}
四、确定输出概率矩阵
所谓输出概率矩阵,是指已知某个隐含状态的前提下,出现某个显示状态的概率。例如天晴去公园散步的概率是
0.6,去购物的概率是0.3,打扫房间的概率是0.1。
我们知道,如果隐含状态有2个,显示状态有3个,那么总共有2*3=6个输出概率,一般也是使用矩阵来表示。根据去年的历史天气记录,以及朋友朋友圈的状态,即可统计出输出概率矩阵如下所示:
公园散步 外出购物 清理房间
下雨 0.1 0.4 0.5
天晴 0.6 0.3 0.1
知道了上面这四大条件后,我们就可以来计算隐含状态,也就是出现显示状态是 [
公园散步, 外出购物, 清理房间
] ,最可能的隐含状态是什么?
因为我们不讲解原理,直接上代码,使用Python来计算,如下图所示:
执行代码,即可得到: