第14章 概率图模型-隐马尔可夫模型

14.1 隐马尔可夫模型

机器学习最重要的任务:

根据一些已经观察到的证据(例如训练样本)来对感兴趣的未知变量(例如类别标记)进行估计推测

具体来说,假定所关心的变量集合为 Y Y ,可观测变量集合为O,其它变量的集合为 R R ,“生成式”模型考虑联合分布P(Y,R,O),“判别式”模型考虑条件分布 P(Y,R|O) P ( Y , R | O ) 。给定一组变量值,推断就是要由 P(Y,R,O) P ( Y , R , O ) P(Y,R|O) P ( Y , R | O ) 得到条件概率分布 P(Y|O) P ( Y | O )

直接利用概率求和规则消去变量 R R 显然不可行,因为即便每个变量仅有两种取指的简单问题,其复杂度已至少是O(2|Y|+|B|)。另一方面,属性变量之间往往存在复杂的联系,因此概率模型的学习,即基于训练样本来估计变量分布的参数往往相当困难。为了便于研究高效的推断和学习算法,需要有一套简洁紧凑地表达变量关系的工具。

名词解释

概率模型(Probabilistic Model):提供了一种描述框架,将学习任务归结于计算变量的概率分布。
推断:在概率模型中,利用已知变量来推测未知变量的分布称为推断
概率图模型(Probabilistic Graphical Model):是一类用图来表达变量相关关系的概率模型
隐马尔可夫模型(Hidden Markov Model,简称HMM):是结构最简单的动态贝叶斯网络(Dynamic Bayesian Network),这是一种著名的有向图模型,主要用于时序数据建模,在语音识别、自然语言处理等领域有广泛应用。

图1 隐马尔可夫模型的图结构

隐马尔可夫模型的图结构

如图所示,隐马尔可夫模型中的变量可以分为两组,第一组是状态 变量 {y1,y2,...,yn} { y 1 , y 2 , . . . , y n } ,其中 yiY y i ∈ Y 表示第 i i 时刻的系统状态。通常假定状态变量是隐藏的、不可被观测的,因此状态变量亦称隐变量(hidden variable)。第二组是观测变量{x1,x2,...,xn},其中 xX x ∈ X 表示第 i i 时刻的观测值。在隐马尔可夫模型中,系统通常在多个状态{s1,s2,...,sn}之间转换,因此状态变量 yi y i 的取值范围 Y Y (称为状态空间)通常是有 n n 个可能取值的离散空间。观测变量xi可以是离散型也可以是连续型,为了便于讨论,我们仅考虑离散型观测变量,并假定其取指范围 X X {o1,o2,...,om} { o 1 , o 2 , . . . , o m }
图1中的箭头表示了变量间的依赖关系。在任一时刻,观测变量的取值仅依赖于状态变量,即 xt x t yt y t 确定,与其他状态变量及观测变量的取值无关。同时, t t 时刻的状态yt仅依赖于 t1 t − 1 时刻的状态 yt1 y t − 1 ,与其余 n2 n − 2 个状态无关。这就是所谓的“马尔可夫链(Markov chain)”,即:系统下一个时刻的状态仅由当前状态决定,不依赖于以往的任何状态。基于这种依赖关系,所有变量的联合概率分布为

P(x1,y1,...,xn,yn)=P(y1)P(x1|y1)i=2P(yi|yi1)P(xi|yi)1 P ( x 1 , y 1 , . . . , x n , y n ) = P ( y 1 ) P ( x 1 | y 1 ) ∏ i = 2 ∞ ⁡ P ( y i | y i − 1 ) P ( x i | y i ) · · · ( 1 )

除了结构信息,欲确定一个隐马尔可夫模型还需要以下三组参数:
(1)状态转移概率: 模型在各个状态间转换的概率,通常记为矩阵 A=[aij]N×N A = [ a i j ] N × N ,其中

aij=P(yt+1=sj|yt=si),1i,jN, a i j = P ( y t + 1 = s j | y t = s i ) , 1 ≤ i , j ≤ N ,

表示在任意时刻 t t ,若状态为si,则在下一时刻状态为 sj s j 的概率。
(2)输出观测概率: 模型根据当前状态获得各个观测值的概率,通常记为矩阵 B=[bij]N×M B = [ b i j ] N × M ,其中
bij=P(xt=oj|yt=si),1iN,1jM b i j = P ( x t = o j | y t = s i ) , 1 ≤ i ≤ N , 1 ≤ j ≤ M

表示在任意时刻 t t ,若状态为si,则在下一刻状态为 sj s j 的概率。
(3)初始状态概率: 模型在初始时刻各状态出现的概率,通常记为 π=(π1,π2,...,πn) π = ( π 1 , π 2 , . . . , π n ) ,其中
pii=P(y1=si),1iN p i i = P ( y 1 = s i ) , 1 ≤ i ≤ N

表示模型的初始状态为 si s i 的概率。
观测序列的产生过程:

通过指定状态空间 Y Y 、观测空间 X X 和上述三个参数,就能确定一个隐马尔可夫模型,通过用其参数 λ=[A,B,pi] λ = [ A , B , p i ] 来指代。给定隐马尔可夫模型 λ λ ,它按如下过程产生观测序列 {x1,x2,...,xn} { x 1 , x 2 , . . . , x n }
(1)设置 t=1 t = 1 ,并根据初始状态概率 pi p i 选择初始状态 y1 y 1 ;
(2)根据状态 yt y t 和输出观测概率 B B 选择观测变量取值xt
(3)根据状态 yt y t 和状态转移矩阵 A A 转移模型状态,即确定yt+1
(4)若 t<n t < n ,设置 t=t+1 t = t + 1 ,并转到第(2)步,否则停止。
其中 yt{s1,s2,...,sn} y t ∈ { s 1 , s 2 , . . . , s n } xt{o1,o2,...,om} x t ∈ { o 1 , o 2 , . . . , o m } 分别为第 t t 时刻的状态和观测值。

在实际应用中,人们常关注隐马尔可夫模型的三个基本问题:

(1)给定模型λ=[A,B,π],如何有效计算其产生观测序列 x={x1,x2,...,xn} x = { x 1 , x 2 , . . . , x n } 的概率 P(x|λ) P ( x | λ ) ?换言之,如何评价模型与观测序列之间的匹配程度?
(2)给定模型 λ=[A,B,π] λ = [ A , B , π ] 和观测序列 x={x1,x2,...,xn} x = { x 1 , x 2 , . . . , x n } ,如何找到与此观测序列最匹配的状态序列 y={y1,y2,...,yn} y = { y 1 , y 2 , . . . , y n } ?换言之,如何根据观测序列推断出隐藏的模型状态?
(3)给定观测序列 x={x1,x2,...,xn} x = { x 1 , x 2 , . . . , x n } ,如何调整模型参数 λ=[A,B,π] λ = [ A , B , π ] 使得该序列出现的概率 P(x|λ) P ( x | λ ) 最大?换言之,如何训练模型使其能最好地描述观测数据?

上述问题在现实应用中非常重要。例如许多任务需要根据以往的观测序列 {x1,x2,...,xn} { x 1 , x 2 , . . . , x n } 来推测当前时刻最有可能的观测值 xn x n ,这显然可转化为求取概率 P(x|λ) P ( x | λ ) ,即上述第一个问题;在语音识别等任务中,观测值为语音信号,隐藏状态为文字,目标就是根据观测信号来推断最有可能的状态序列(即对应的文字),即上述第二个问题;在大多数现实应用中,人工指定模型参数已变得越来越不可行,如何根据训练样本学得最优的模型参数,恰是上述第三个问题。值得庆幸的是,基于式(1)的条件独立性,隐马尔可夫模型的这三个问题均能被高效求解。

主要介绍了概率图模型的基本概念和常见类型,以及如何利用Python实现这些模型。下面是一些笔记和代码示例。 ## 概率图模型的基本概念 概率图模型是一种用于表示和处理不确定性的图形化模型,它能够将一个复杂的联合概率分布表示为多个简单的条件概率分布的乘积形式,从而简化概率推理和模型学习的过程。概率图模型主要包括两种类型:有向图模型和无向图模型。 有向图模型(Directed Acyclic Graph, DAG)又称为贝叶斯网络(Bayesian Network, BN),它用有向边表示变量之间的因果关系,每个节点表示一个随机变量,给定父节点的条件下,每个节点的取值都可以用一个条件概率分布来描述。有向图模型可以用贝叶斯公式进行概率推理和参数学习。 无向图模型(Undirected Graphical Model, UGM)又称为马尔可夫随机场(Markov Random Field, MRF),它用无向边表示变量之间的相互作用关系,每个节点表示一个随机变量,给定邻居节点的取值,每个节点的取值都可以用一个势函数(Potential Function)来描述。无向图模型可以用和有向图模型类似的方法进行概率推理和参数学习。 ## 概率图模型的Python实现 在Python中,我们可以使用`pgmpy`库来实现概率图模型。该库提供了一个简单而强大的接口来定义和操作概率图模型,支持有向图模型和无向图模型的构建、概率推理、参数学习等功能。 ### 有向图模型 以下是一个简单的有向图模型的示例: ```python from pgmpy.models import BayesianModel model = BayesianModel([('A', 'B'), ('C', 'B'), ('B', 'D')]) ``` 其中,`BayesianModel`是有向图模型的类,`('A', 'B')`表示A节点指向B节点,即B节点是A节点的子节点,依此类推。我们可以使用以下代码查看模型的结构: ```python print(model.edges()) # 输出:[('A', 'B'), ('B', 'D'), ('C', 'B')] ``` 接下来,我们可以为每个节点定义条件概率分布。以下是一个简单的例子: ```python from pgmpy.factors.discrete import TabularCPD cpd_a = TabularCPD(variable='A', variable_card=2, values=[[0.2, 0.8]]) cpd_c = TabularCPD(variable='C', variable_card=2, values=[[0.4, 0.6]]) cpd_b = TabularCPD(variable='B', variable_card=2, values=[[0.1, 0.9, 0.3, 0.7], [0.9, 0.1, 0.7, 0.3]], evidence=['A', 'C'], evidence_card=[2, 2]) cpd_d = TabularCPD(variable='D', variable_card=2, values=[[0.9, 0.1], [0.1, 0.9]], evidence=['B'], evidence_card=[2]) model.add_cpds(cpd_a, cpd_c, cpd_b, cpd_d) ``` 其中,`TabularCPD`是条件概率分布的类,`variable`表示当前节点的变量名,`variable_card`表示当前节点的取值个数,`values`表示条件概率分布的值。对于有父节点的节点,需要指定`evidence`和`evidence_card`参数,表示当前节点的父节点和父节点的取值个数。 接下来,我们可以使用以下代码进行概率推理: ```python from pgmpy.inference import VariableElimination infer = VariableElimination(model) print(infer.query(['D'], evidence={'A': 1})) # 输出:+-----+----------+ # | D | phi(D) | # +=====+==========+ # | D_0 | 0.6000 | # +-----+----------+ # | D_1 | 0.4000 | # +-----+----------+ ``` 其中,`VariableElimination`是概率推理的类,`query`方法用于查询给定变量的概率分布,`evidence`参数用于指定给定变量的取值。 ### 无向图模型 以下是一个简单的无向图模型的示例: ```python from pgmpy.models import MarkovModel model = MarkovModel([('A', 'B'), ('C', 'B'), ('B', 'D')]) ``` 其中,`MarkovModel`是无向图模型的类,与有向图模型类似,`('A', 'B')`表示A节点和B节点之间有相互作用关系。 接下来,我们可以为每个节点定义势函数。以下是一个简单的例子: ```python from pgmpy.factors.discrete import DiscreteFactor phi_a = DiscreteFactor(['A'], [2], [0.2, 0.8]) phi_c = DiscreteFactor(['C'], [2], [0.4, 0.6]) phi_b = DiscreteFactor(['A', 'C', 'B'], [2, 2, 2], [0.1, 0.9, 0.3, 0.7, 0.9, 0.1, 0.7, 0.3]) phi_d = DiscreteFactor(['B', 'D'], [2, 2], [0.9, 0.1, 0.1, 0.9]) model.add_factors(phi_a, phi_c, phi_b, phi_d) ``` 其中,`DiscreteFactor`是势函数的类,与条件概率分布类似,需要指定变量名、变量取值个数和势函数的值。 接下来,我们可以使用以下代码进行概率推理: ```python from pgmpy.inference import BeliefPropagation infer = BeliefPropagation(model) print(infer.query(['D'], evidence={'A': 1})) # 输出:+-----+----------+ # | D | phi(D) | # +=====+==========+ # | D_0 | 0.6000 | # +-----+----------+ # | D_1 | 0.4000 | # +-----+----------+ ``` 其中,`BeliefPropagation`是概率推理的类,与有向图模型类似,`query`方法用于查询给定变量的概率分布,`evidence`参数用于指定给定变量的取值。 ## 总结 本介绍了概率图模型的基本概念和Python实现,包括有向图模型和无向图模型的构建、条件概率分布和势函数的定义、概率推理等。使用`pgmpy`库可以方便地实现概率图模型,对于概率模型的学习和应用都有很大的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值