内容纲要

欢迎转载,作者:Ling,注明出处:机器学习:原理简明教程10-HMM

 

一句话概括:隐马尔科夫模型是一个三元组,包含状态转移矩阵,发射矩阵以及初始状态,可以解决三类问题,计算模型下观测序列的概率,方法是用DP,估计模型三个参数值,方法是用EM或者样本训练,已知模型和观测序列计算最佳状态序列,方法是维特比DP

 

隐马尔可夫模型

  • 标记问题的统计学习模型
  • 生产模型
  • 应用于:语音识别,自然语言处理,生物信息,模式识别

 

隐马尔可夫模型的基本概念

隐马尔可夫模型的定义

ml_hmm_001

ml_hmm_002

注:

HMM就是一个三元组(A,B,π),分别是状态转移矩阵,发射矩阵,起始状态(或者说是起始状态概率分布)

 

实例:

ml_hmm_003

ml_hmm_004

 

另一个实例:

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},

    }

 

对应的图:

ml_hmm_005

states代表病情,observations表示最近三天观察到的身体感受,start_probability代表病情的分布,transition_probability是病情到病情的转移概率,emission_probability则是病情表现出身体状况的发射概率。隐马的五元组都齐了。

 

观测序列的生成过程

 

ml_hmm_006

注:

简单说就是,首先根据π,决定初始状态,生成初始观测值,然后根据状态转移的概率分布,生成新状态,产生新的观测值,如此反复,直到停止。

 

隐马尔可夫模型的3个基本问題

ml_hmm_007

注:

1)第一个问题简单,就是求能产生观测值得所有序列的概率和,但是需要用到DP,记录已经计算的值,否则计算量过大,分前向和后向两种算法。

2)第二个问题复杂,而且感觉效果不好,主要是用EM算法对HMM的三大参数进行估计。

3)第三个

 

 

概率计算算法

三种:直接计算,前向,后向算法

 

直接计算法

ml_hmm_008

注:

状态组合太多,爆炸

 

前向算法

ml_hmm_009

ml_hmm_010

ml_hmm_011

注:用了DP算法,保存了一系列加和的值,且后一个只依赖前一系列值,从而减少计算

 

实例:

ml_hmm_012

ml_hmm_013

后向算法

ml_hmm_014

ml_hmm_015

学习算法

隐马尔可夫模型的学习,根据训练数据是包括观测序列和对应的状态序列还是只有观测序列,可以分别由监督学习与非监督学习实现。本节首先介绍监督学习算法,而后介绍非监督学习算法——Baum-Weich算法(也就是EM算法)。

 

监督学习方法

就是根据样本统计,得到所有参数的值

ml_hmm_016

ml_hmm_017

 

Baum-Welch算法

ml_hmm_018

ml_hmm_019

ml_hmm_020

注:

整个过程就是拆分log之后,对每部分都求导求极值

 

Baum-Welch模型参数估计公式

ml_hmm_021

ml_hmm_022

注:

一份来自colostate大学的教学代码,全部运算都是浮点数乘法,没有取对数,所以在数据量较大的时候可能发生除零错误。

视simulate出来的随机数据不同,准确率在40%-70%之间波动。这其实说明对于这个例子,无监督学习并不靠谱。尽量用有监督的方法。

 

预测算法

下面介绍隐马尔可夫模型预测的两种算法:近似算法与维特比算法(Viterbi algorithm)。

ml_hmm_023

 

维特比算法

ml_hmm_024

ml_hmm_025

ml_hmm_026

注:

是一个DP算法,下一列最优状态,只依赖于前一列最优状态

 

实例:

ml_hmm_027

ml_hmm_028