机器学习:原理简明教程10-HMM
欢迎转载,作者:Ling,注明出处:机器学习:原理简明教程10-HMM
一句话概括:隐马尔科夫模型是一个三元组,包含状态转移矩阵,发射矩阵以及初始状态,可以解决三类问题,计算模型下观测序列的概率,方法是用DP,估计模型三个参数值,方法是用EM或者样本训练,已知模型和观测序列计算最佳状态序列,方法是维特比DP
隐马尔可夫模型
- 标记问题的统计学习模型
- 生产模型
- 应用于:语音识别,自然语言处理,生物信息,模式识别
隐马尔可夫模型的基本概念
隐马尔可夫模型的定义
注:
HMM就是一个三元组(A,B,π),分别是状态转移矩阵,发射矩阵,起始状态(或者说是起始状态概率分布)
实例:
另一个实例:
https://en.wikipedia.org/wiki/Viterbi_algorithm#Example
你本是一个城乡结合部修电脑做网站的小码农,突然春风吹来全民创业。于是跟村头诊所的老王
响应总理号召合伙创业去了,有什么好的创业点子呢?对了,现在不是很流行什么“大数据”么,那就搞个“医疗大数据”吧,虽然只是个乡镇诊所……但管它呢,投资人就好这口。
数据从哪儿来呢?你把老王,哦不,是王老板的出诊记录都翻了一遍,发现从这些记录来看,村子里的人只有两种病情:要么健康,要么发烧。但村民不确定自己到底是哪种状态,只能回答你感觉正常、头晕或冷。有位村民是诊所的常客,他的病历卡上完整地记录了这三天的身体特征(正常、头晕或冷),他想利用王老板的“医疗大数据”得出这三天的诊断结果(健康或发烧)。
这时候王老板掐指一算,说其实感冒这种病,只跟病人前一天的病情有关,并且当天的病情决定当天的身体感觉。
于是你一拍大腿,天助我也,隐马尔可夫模型的两个基本假设都满足了,于是统计了一下病历卡上的数据,撸了这么一串Python代码:
states = ('Healthy', 'Fever')
observations = ('normal', 'cold', 'dizzy')
start_probability = {'Healthy': 0.6, 'Fever': 0.4}
transition_probability = {
'Healthy': {'Healthy': 0.7, 'Fever': 0.3},
'Fever': {'Healthy': 0.4, 'Fever': 0.6},
}
emission_probability = {
'Healthy': {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1},
'Fever': {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6},
}
对应的图:
states代表病情,observations表示最近三天观察到的身体感受,start_probability代表病情的分布,transition_probability是病情到病情的转移概率,emission_probability则是病情表现出身体状况的发射概率。隐马的五元组都齐了。
观测序列的生成过程
注:
简单说就是,首先根据π,决定初始状态,生成初始观测值,然后根据状态转移的概率分布,生成新状态,产生新的观测值,如此反复,直到停止。
隐马尔可夫模型的3个基本问題
注:
1)第一个问题简单,就是求能产生观测值得所有序列的概率和,但是需要用到DP,记录已经计算的值,否则计算量过大,分前向和后向两种算法。
2)第二个问题复杂,而且感觉效果不好,主要是用EM算法对HMM的三大参数进行估计。
3)第三个
概率计算算法
三种:直接计算,前向,后向算法
直接计算法
注:
状态组合太多,爆炸
前向算法
注:用了DP算法,保存了一系列加和的值,且后一个只依赖前一系列值,从而减少计算
实例:
后向算法
学习算法
隐马尔可夫模型的学习,根据训练数据是包括观测序列和对应的状态序列还是只有观测序列,可以分别由监督学习与非监督学习实现。本节首先介绍监督学习算法,而后介绍非监督学习算法——Baum-Weich算法(也就是EM算法)。
监督学习方法
就是根据样本统计,得到所有参数的值
Baum-Welch算法
注:
整个过程就是拆分log之后,对每部分都求导求极值
Baum-Welch模型参数估计公式
注:
有一份来自colostate大学的教学代码,全部运算都是浮点数乘法,没有取对数,所以在数据量较大的时候可能发生除零错误。
视simulate出来的随机数据不同,准确率在40%-70%之间波动。这其实说明对于这个例子,无监督学习并不靠谱。尽量用有监督的方法。
预测算法
下面介绍隐马尔可夫模型预测的两种算法:近似算法与维特比算法(Viterbi algorithm)。
维特比算法
注:
是一个DP算法,下一列最优状态,只依赖于前一列最优状态
实例:
留言