隐马尔可夫模型以贝叶斯网络为数据框架,用Baum-Welch算法进行无监督训练,通过Viterbi算法计算隐含状态。用于对“在一定程度上相关,却又不绝对相关的两种事件”进行建模分析。
HMM(两层模型) | 可见层 | 普通状态结点 | 推测隐藏层马尔可夫状态链中各结状态 |
隐藏层 | 马尔可夫状态链 | 各结点不直接可见 |
理解隐马尔可夫模型的关键如下:
1、显示层的结点状态是可以直接获取的;
2、作为隐藏层的马尔可夫链的个结点状态不直接可见,需要用可见层的状态去推测。
Python中hmmlearn以从隐藏层状态到可见层状态输出概率的不同形式给出了三种HMM模型:MultiomialHMM, GaussianHMM, GMMHMM。
MultiomialHMM:可见层状态为离散类型,即下例中的观测的发散概率。
GaussianHMM:可见层状态是连续类型且假设输出概率符合高斯分布,比如,在金融数据模型中常吧某金额/某数量作为可见层状态。
GMMHMM:可见层状态是连续类型且假设输出概率符合混合高斯分布。与GaussianHMM的不同仅在于它假设输出概率使用混合高斯分布而非简单的高斯分布。混合高斯分布可以想象为有多个峰值的分布:如果某股票市场经常暴涨暴跌,而平盘或微幅波动的情况很少,则可以选择GMMHMMM模型。
(在众多场景中可见层状态需要建模成连续型概率分布,如金融分析、语音识别等领域。这种情况下由于可见状态无法穷举,所以无法以定长定宽的矩阵形式表达输出概率;由于连续型状态的值之间有大小关系,使其能够用正态分布标准,所以在hmmLearn中使用高斯分布和混合高斯分布来对其建模)
用《从机器学习到深度学习》中第六章的活动/天气模型为例。
假设有这样一个问题,远在另一个城市上大学的儿子每天通过邮件向你汇报他今天做的最多事情是什么,这些事情可能是这三项之一:打球、读书、访友。那么在这种场景下,如何推测儿子所在城市的天气情况。假设儿子活动有如下规律:在晴天更可能打球,在阴天更可能访友,在雨天更可能的读书,在散发概率矩阵中显示为概率值大小。
在这个问题中,儿子的活动类型构成了模型的可见层,天气情况成了隐藏层。
那么 1.状态的样本空间 states = ('晴', '阴','雨');
2.起始个状态概率 start_probability = {'晴':0.5, '阴':0.3,'雨':0.2}
3.状态转移概率 transition_probability = {
'晴': {'晴':0.7, '阴':0.2,'雨':0.1},
'阴': {'晴':0.3, '阴':0.5,'雨':0.2},
'雨': {'晴':0.3, '阴':0.4,'雨':0.3},
}
4.状态->观测的发散概率 emission_probability = {
'晴': { '读书': 0.3,'打球': 0.4, '访友': 0.3},
'阴': { '读书': 0.3,'打球': 0.2, '访友': 0.5},
'雨': { '读书': 0.8,'打球': 0.1, '访友': 0.1},
}
5.观测的样本空间 observations = ( '读书', '打球','访友','读书')
在HMM模型中的隐藏层状态、可见层状态、输出概率、转换概率等几种数据中,通常有一些是未知的,而HMM的目的就是找出这些未知数据。通常可以把这些问题归结为三种类型;
1、状态问题。已知模型的所有参数(隐藏层状态类型、可见层状态类型、输出概率表、转换概率表),求任意一个可见层状态链产生的几率。在描述的学生活动/天气模型中,这类问题包括:求三天连续读书的概率是多少?求第一天访友、第二天打球的概率是多少?在hmmLearn中所有的HMM模型类都有一个.score()成员函数,用于为给定模型的某个可见状态计算可能性,算法可以是暴力求解、前向算法、后向算法。
2、解码问题,隐藏层状态猜测。已知模型的的所有参数,并且知道某一组可见层的状态链,求这些可见状态下对应的隐藏状态链是什么。在描述的学生活动/天气模型中,这类问题类似于,已知学生连续四天的活动分别为读书、读书、打球、访问,求这四天的天气状况是什么?在hmmLearn中可以直接调用几个HMM模型的.predict()函数用Viterbi算法进行隐藏层状态推测(https://blog.csdn.net/Luzichang/article/details/91365752)。
3、训练模型参数。已知隐藏层状态数量(天气)、可见层状态数量(活动)、足够长的可见状态链,求模型中的输出概率表和概率转换表。自然,已知的可见层状态链越长,模型参数的推测也越准确。hmmLearn中训练数据的方法为.fit()函数,所有三个hmmLearn中定义的HMM模型都用该方法进行数据训练,其内部算法就是Baum-Welch算法。
在hmmLearn中连续模型与离散模型在解决HMM三大问题的调用方式保持一致,分别用.score()、.predict()、.fit()函数进行概率估计、隐藏层猜测、无监督学习。