序列比对(十六)——Baum-Welch算法估算HMM参数

本文详细介绍了如何使用Baum-Welch算法来估算隐马尔科夫模型(HMM)的概率参数。通过C代码展示了算法在不同序列长度下的效果,强调了算法依赖于初始值设定,可能导致局部最优解。文中还提供了相关公式的推导和计算过程。
摘要由CSDN通过智能技术生成

原创:hxj7

本文介绍了如何用Baum-Welch算法来估算HMM模型中的概率参数。

Baum-Welch算法应用于HMM的效果

前文《序列比对(15)EM算法以及Baum-Welch算法的推导》介绍了EM算法Baum-Welch算法的推导过程。Baum-Welch算法是EM算法的一个特例,用来估算HMM模型中的概率参数。其具体步骤如下:
在这里插入图片描述

图片引自《生物序列分析》

本文给出了Baum-Welch算法的C代码,还是以投骰子为例,估算出了转移概率以及发射概率。

具体效果如图:
(下面几张图中的 Real 表示真实的转移概率以及发射概率,而Baum-Welch表示用Baum-Welch算法估算的转移概率以及发射概率。)
首先是当若干条序列总长度300时:
在这里插入图片描述
在这里插入图片描述
然后是当若干条序列总长度30000时:
在这里插入图片描述
在这里插入图片描述
可以看出总长度为30000时已经很接近真实值了。但是,Baum-Welch算法的结果时一个局部最优值,很依赖初始值的设定。所以,当初始值不同时,也有可能会出现这种结果:
在这里插入图片描述
在这里插入图片描述
小结一下:

  • Baum-Welch算法通过多次迭代来估算HMM模型中的概率参数。
  • 本文代码设定了迭代的终止条件:当“归一化后的平均对数似然”的变化小于预先设定的阈值时或者迭代次数超出最大迭代次数时,迭代终止。
  • Baum-Welch算法的最终结果非常依赖初始值的设定。
  • 本文代码中的初始值是随机值。
  • 在计算期望次数时,使用了伪计数。

代码中所用公式及其推导

其中的 A k l A_{kl} Akl指的是 a k l a_{kl} akl在所有训练序列中出现的期望次数,而 E k ( b ) E_k(b) Ek(b)指的是 e k ( b ) e_k(b) ek(b)在所有训练序列中出现的期望次数。用符号表示就是(其中 x j x^j xj表示第j条符号序列):
(1.1) A k l = ∑ j ∑ π P ( π j ∣ x j , θ ) A k l ( π j ) = ∑ j ∑ i P ( π i j = k , π i + 1 j = l ∣ x j , θ ) \begin{aligned} \displaystyle A_{kl} & = \sum_{j} \sum_{\pi} P(\pi^j|x^j,\theta) A_{kl}(\pi^j) \\ & = \sum_{j} \sum_i P(\pi_i^j=k, \pi_{i+1}^j=l|x^j,\theta) \tag{1.1} \end{aligned} Akl=jπP(πjxj,θ)Akl(πj)=jiP(πij=k,πi+1j=lxj,θ)(1.1)
(1.2) E k ( b ) = ∑ j ∑ π P ( π j ∣ x j , θ ) E k ( b , π j ) = ∑ j ∑ i P ( π i j = k , x i j = b ∣ x j , θ ) = ∑ j ∑ { i ∣ x i j = b } P ( π i j = k ∣ x j , θ ) \begin{aligned} \displaystyle E_k(b) & = \sum_j \sum_\pi P(\pi^j|x^j, \theta) E_k(b, \pi^j) \\ & = \sum_{j} \sum_i P(\pi_i^j=k, x_i^j=b|x^j,\theta) \\ & = \sum_{j} \sum_{\{i|x_i^j=b\}} P(\pi_i^j=k|x^j,\theta) \tag{1.2} \end{aligned} Ek(b)=jπP(πjxj,θ)Ek(b,πj)=jiP(πij=k,xij=bxj,θ)=j{ ixij=b}P(πij=kxj,θ)(1.2)

我们可以推导出,对某一条序列 x j x^j xj有如下结论:
(2.1) P ( π i = k , π i + 1 = l ∣ x , θ ) = f ~ k ( i ) a k l e l ( x i + 1 ) b ~ l ( i + 1 ) P(\pi_i=k, \pi_{i+1}=l|x,\theta) = \tilde{f}_k(i) a_{kl} e_l(x_{i+1}) \tilde{b}_l(i+1) \tag{2.1} P(πi=k,πi+1=lx,θ)=f~k(i)aklel(xi+1)b~l(i+1)(2.1)
(2.2) P ( π i = k ∣ x , θ ) = f ~ k ( i ) b ~ k ( i ) s i P(\pi_i=k|x,\theta) = \tilde{f}_k(i) \tilde{b}_k(i) s_i \tag{2.2} P(πi=kx,θ)=f~k(i)b~k(i)si(2.2)

其中 f ~ k ( i ) \tilde{f}_k(i) f~k(i) b ~ k ( i ) \tilde{b}_k(i) b~k(i) 以及 s i s_i si 的定义在前文《序列比对(12):计算后验概率》中已经给出(下文给出了计算公式)。

公式(2.1)的推导如下:
P ( π i = k , π i + 1 = l ∣ x , θ ) = P ( π i = k , π i + 1 = l , x ∣ θ ) P ( x ∣ θ ) = P ( π i = k , π i + 1 = l , x 1 , . . . , x i , x i + 1 , . . . , x L ∣ θ ) P ( x ∣ θ ) = P ( x 1 , . . . , x i , π i = k ∣ θ ) P ( x i + 1 , . . . , x L , π i + 1 = l ∣ x 1 , . . . , x i , π i = k , θ ) P ( x ∣ θ ) = f k ( i ) P ( x i + 1 , . . . , x L , π i + 1 = l ∣ x 1 , . . . , x i , π i = k , θ ) P ( x ∣ θ ) = f k ( i ) P ( x i + 1 , . . . , x L , π i + 1 = l ∣ π i = k , θ ) P ( x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值