序列比对(十七)——第二部分的小结

原创:hxj7
序列比对的系列文章第二部分主要介绍了HMM(隐马尔科夫模型),包含了八篇文章:
《序列比对(九)从掷骰子说起HMM》
《序列比对(十)viterbi算法求解最可能路径》
《序列比对(11)计算符号序列的全概率》
《序列比对(12):计算后验概率》
《序列比对(13)后验解码》
《序列比对(14)viterbi算法和后验解码的比较》
《序列比对(15)EM算法以及Baum-Welch算法的推导》
《序列比对(16)Baum-Welch算法估算HMM参数》

HMM模型最关键的一点就是在一个状态序列中,某一步状态的概率只与上一步的状态有关。也正是因为与前面一步状态有关,所以HMM模型天然地适用动态规划算法。

这几篇文章都是以掷骰子为例。

一、如何随机生成状态序列和符号序列:

假定要随机生成一个状态序列和一个符号序列,那么:

给出了转移概率发射概率的符号定义:

若是给初始状态0和初始符号建模,则有:

若是给结束状态0建模,我们假定:

二、Viterbi算法求解最可能路径

一条路径就是一个状态序列。在符号序列已知的情况下,如何猜出来最有可能的路径。即

这个可以用Viterbi算法求解。Viterbi算法是一种动态规划算法。假设是以状态以及符号结束的所有序列中概率的最大值。那么
Viterbi算法的初始条件是:

迭代公式是:

终止条件是:

回溯公式是:

三、前向算法和后向算法计算符号序列的全概率

假设符号序列已知,而路径未知,那么符号序列的全概率如何计算?就是

具体计算仍然使用动态规划迭代计算,按照序列迭代的方向可分为前向算法和后向算法。

所谓前向算法,就是从序列头部开始迭代,直至序列尾部。其初始条件是:

迭代公式是:

终止条件是:

所谓后向算法,就是从序列尾部开始迭代,直至序列头部。其初始条件是:

迭代公式是:

终止条件是:

在实际的计算中,为了解决多个概率相乘可能导致的下溢问题,要对概率进行适当的缩放。我们选择了缩放因子这一方法。我们首先定义缩放后的概率:

缩放因子的计算方法是:

并且有:

用缩放后的概率表示前向算法:
\tilde{f}_k(0) = \begin{cases} 0, & \text{if $k \neq 0$} \\ 1, & \text{if $k = 0$} \end{cases} \\ s_{i+1} = \sum_l e_l(x_{i+1}) \sum_k \tilde{f}_k(i)a_{kl} \\ \tilde{f}_l(i+1) = \frac{1}{s_{i+1}} e_l(x_{i+1}) \sum_k \tilde{f}_l(i) a_{kl} \tag{3.11}

用缩放后的概率表示后向算法:

四、后验概率的计算与后验解码

当符号序列已知而路径未知时,我们除了关心最可能路径外,也对某一位置状态的概率感兴趣。很明显,这是一个后验概率,通过推导,可以通过下面的公式计算:

如果利用缩放后的概率计算,上述公式变为:

所谓后验解码,就是对每一个位置,计算得到该位置最有可能的状态。即

五、Baum-Welch算法估算HMM模型参数

EM算法是一种在有缺失数据的情况下利用最大似然法最大对数似然法估算概率模型参数的迭代方法。

假设缺失数据是,那么EM算法的步骤就是:
E步骤(Expectation)要计算函数:

M步骤(Maximization)根据步骤的结果计算得到步骤的参数:

终止条件就是当(对数)似然值变化小于一个阈值或者迭代次数超过最大迭代次数,即:
\begin{aligned} & P(x|\theta^{t+1}) - P(x|\theta^t) < T \\ & \text{\textbf{or}} \ \ \ \log P(x|\theta^{t+1}) - \log P(x|\theta^t) < T \\ & \text{\textbf{or}} \ \ \ t > MaxIter \tag{5.4} \end{aligned}

Baum-Welch算法是EM算法的一个特例。当符号序列已知而路径未知时,可以用Baum-Welch算法来估算HMM模型的参数。这时,缺失数据就是路径。那么,Baum-Welch算法的函数变为:

HMM模型的参数主要是转移概率以及发射概率,可以证明,当Baum-Welch算法采用如下迭代方式计算参数时,可以让对数似然取到局部最大值:
a_{kl}^{t+1} = \frac{A_{kl}^t + r_{kl}}{\displaystyle \sum_{l'} \Big[A_{kl'}^t + r_{kl'} \Big]} \\ e^{t+1}_k(b) = \frac{E^{t+1}_k(b) + r_k(b)}{\displaystyle \sum_{b'} \Big[E^{t+1}_k(b') + r_k(b') \Big]} \tag{5.6}

其中,表示迭代的次数,是在所有训练序列中发生的期望次数,是在所有训练序列中发生的期望次数。即

\begin{align} \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{5.8} \end{align}

如果用前向算法和后向算法中的符号表示的话,我们可以推导得到:
\begin{align} \displaystyle A_{kl} & = \sum_j \frac {1} {P(x^j|\theta)} \sum_i f^j_k(i) b^j_l(i+1) a_{kl} e_l(x^j_{i+1}) \\ & = \sum_j \sum_i \tilde{f}^j_k(i) a_{kl} e_l(x^j_{i+1}) \tilde{b}^j_l(i+1) \tag{5.9} \end{align}

\begin{align} \displaystyle E_k(b) & = \sum_{j} \frac {1} {P(x^j|\theta)} \sum_{\{i|x_i^j=b\}} f^j_k(i) b_k^j(i)\\ & = \sum_{j} \sum_{\{i|x_i^j=b\}} \tilde{f}^j_k(i) \tilde{b}^j_k(i) s^j_i \tag{5.10} \end{align}

伪计数之和反映了我们?认为先验知识的可靠程度。如果伪计数之和较大,则我们认为先验概率比较可靠,需要用更多的数据?取改变它。反之不太可靠。最开始的概率参数可以用随机数?。?只要保证相应的概率和为1即可。

至此,序列比对系列文章已经介绍了“第一部分:二序列比对的常见问题和相应算法”以及“第二部分:HMM模型及相关算法简介”。在学习“将HMM模型应用到序列比对(或序列发现)”之前,我们接下来准备先学习一下多序列比对的常见问题和相关算法。

(公众号:生信了)

你可能感兴趣的:(序列比对(十七)——第二部分的小结)