序列比对的系列文章第二部分主要介绍了HMM(隐马尔科夫模型),包含了八篇文章:
《序列比对(九)从掷骰子说起HMM》
《序列比对(十)viterbi算法求解最可能路径》
《序列比对(11)计算符号序列的全概率》
《序列比对(12):计算后验概率》
《序列比对(13)后验解码》
《序列比对(14)viterbi算法和后验解码的比较》
《序列比对(15)EM算法以及Baum-Welch算法的推导》
《序列比对(16)Baum-Welch算法估算HMM参数》
HMM模型最关键的一点就是在一个状态序列中,某一步状态的概率只与上一步的状态有关。也正是因为与前面一步状态有关,所以HMM模型天然地适用动态规划算法。
这几篇文章都是以掷骰子为例。
一、如何随机生成状态序列和符号序列:
假定要随机生成一个状态序列
π
\pi
π和一个符号序列
x
x
x,那么:
(1.1)
P
(
π
i
∣
π
1
,
π
2
,
.
.
.
,
π
i
−
1
)
=
P
(
π
i
∣
π
i
−
1
)
P(\pi_i|\pi_1,\pi_2,...,\pi_{i-1}) = P(\pi_i|\pi_{i-1}) \tag{1.1}
P(πi∣π1,π2,...,πi−1)=P(πi∣πi−1)(1.1)
(1.2)
P
(
x
i
∣
x
1
,
x
2
,
.
.
.
,
x
i
−
1
,
π
1
,
π
2
,
.
.
.
,
π
i
)
=
P
(
x
i
∣
π
i
)
P(x_i|x_1,x_2,...,x_{i-1},\pi_1,\pi_2,...,\pi_i) = P(x_i|\pi_{i}) \tag{1.2}
P(xi∣x1,x2,...,xi−1,π1,π2,...,πi)=P(xi∣πi)(1.2)
给出了转移概率
和发射概率
的符号定义:
(1.3)
a
k
l
=
P
(
π
i
=
l
∣
π
i
−
1
=
k
)
a_{kl} = P(\pi_i=l|\pi_{i-1}=k) \tag{1.3}
akl=P(πi=l∣πi−1=k)(1.3)
(1.4)
e
k
(
b
)
=
P
(
x
i
=
b
∣
π
i
=
k
)
e_k(b) = P(x_i=b|\pi_i=k) \tag{1.4}
ek(b)=P(xi=b∣πi=k)(1.4)
若是给初始状态0和初始符号
x
0
x_0
x0建模,则有:
(1.5)
e
0
(
b
)
=
{
0
,
if
b
≠
x
0
1
,
if
b
=
x
0
e_0(b) = \begin{cases} 0, & \text{if $b \neq x_0$} \\ 1, & \text{if $b = x_0$} \end{cases} \tag{1.5}
e0(b)={0,1,if b̸=x0if b=x0(1.5)
若是给结束状态0建模,我们假定:
(1.6)
a
k
0
=
1
,
for each possible
k
≠
0
a_{k0} = 1, \ \ \ \text{for each possible $k \neq 0$} \tag{1.6}
ak0=1, for each possible k̸=0(1.6)
二、Viterbi算法求解最可能路径
一条路径
就是一个状态序列。在符号序列已知的情况下,如何猜出来最有可能的路径
π
∗
\pi^*
π∗。即
(2.1) π ∗ = a r g m a x π   P ( x , π ) \pi^* = \underset{\pi}{\mathrm{argmax}} \, P(x, \pi) \tag{2.1} π∗=πargmaxP(x,π)(2.1)
这个可以用Viterbi算法
求解。Viterbi算法是一种动态规划算法。假设
v
k
(
i
)
v_k(i)
vk(i)是以状态
k
k
k以及符号
x
i
x_i
xi结束的所有序列中概率的最大值。那么
Viterbi算法的初始条件是:
(2.2)
v
k
(
0
)
=
{
0
,
if
k
≠
0
1
,
if
k
=
0
v_k(0) = \begin{cases} 0, & \text{if $k \neq 0$} \\ 1, & \text{if $k = 0$} \end{cases} \tag{2.2}
vk(0)={0,1,if k̸=0if k=0(2.2)
迭代公式是:
(2.3)
v
l
(
i
+
1
)
=
e
l
(
x
i
+
1
)
max
k
[
v
k
(
i
)
a
k
l
]
p
t
r
i
+
1
(
l
)
=
a
r
g
m
a
x
k
[
v
k
(
i
)
a
k
l
]
v_l(i+1) = e_l(x_{i+1}) \underset{k}{\max} \big[ v_k(i)a_{kl} \big] \\ \mathrm{ptr}_{i+1}(l) = \underset{k}{\mathrm{argmax}} \big[ v_k(i)a_{kl} \big] \tag{2.3}
vl(i+1)=el(xi+1)kmax[vk(i)akl]ptri+1(l)=kargmax[vk(i)akl](2.3)
终止条件是:
(2.4)
P
(
x
,
π
∗
)
=
max
k
 
v
k
(
L
)
π
L
∗
=
a
r
g
m
a
x
k
 
v
k
(
L
)
P(x,\pi^*) = \underset{k}{\max} \, v_k(L) \\ \pi_L^* = \underset{k}{\mathrm{argmax}} \, v_k(L) \tag{2.4}
P(x,π∗)=kmaxvk(L)πL∗=kargmaxvk(L)(2.4)
回溯公式是:
(2.5)
π
i
∗
=
p
t
r
i
+
1
(
π
i
+
1
∗
)
\pi_i^* = \mathrm{ptr}_{i+1}(\pi_{i+1}^*) \tag{2.5}
πi∗=ptri+1(πi+1∗)(2.5)
三、前向算法和后向算法计算符号序列的全概率
假设符号序列
x
x
x已知,而路径
π
\pi
π未知,那么符号序列的全概率
P
(
x
)
P(x)
P(x)如何计算?就是
(3.1)
P
(
x
)
=
∑
π
P
(
x
,
π
)
P(x) = \sum_{\pi} P(x, \pi) \tag{3.1}
P(x)=π∑P(x,π)(3.1)
具体计算仍然使用动态规划迭代计算,按照序列迭代的方向可分为前向算法和后向算法。
所谓前向算法
,就是从序列头部开始迭代,直至序列尾部。其初始条件是:
(3.2)
f
k
(
i
)
=
P
(
x
1
,
x
2
,
.
.
.
,
x
i
,
π
i
=
k
)
f
k
(
0
)
=
{
0
,
if
k
≠
0
1
,
if
k
=
0
f_k(i) = P(x_1,x_2,...,x_i,\pi_i=k) \\ f_k(0) = \begin{cases} 0, & \text{if $k \neq 0$} \\ 1, & \text{if $k = 0$} \end{cases} \tag{3.2}
fk(i)=P(x1,x2,...,xi,πi=k)fk(0)={0,1,if k̸=0if k=0(3.2)
迭代公式是:
(3.3)
f
l
(
i
+
1
)
=
e
l
(
x
i
+
1
)
∑
k
f
k
(
i
)
a
k
l
f_l(i+1) = e_l(x_{i+1}) \sum_k f_k(i)a_{kl} \tag{3.3}
fl(i+1)=el(xi+1)k∑fk(i)akl(3.3)
终止条件是:
(3.4)
P
(
x
)
=
∑
k
f
k
(
L
)
P(x) = \sum_k f_k(L) \tag{3.4}
P(x)=k∑fk(L)(3.4)
所谓后向算法
,就是从序列尾部开始迭代,直至序列头部。其初始条件是:
(3.5)
b
k
(
i
)
=
P
(
x
i
+
1
,
x
i
+
2
,
.
.
.
,
x
L
∣
π
i
=
k
)
b
k
(
L
)
=
1
,
for each possible
k
>
0
b_k(i) = P(x_{i+1},x_{i+2},...,x_L|\pi_i=k) \\ b_k(L) = 1, \ \ \ \ \ \text{for each possible $k > 0$}\tag{3.5}
bk(i)=P(xi+1,xi+2,...,xL∣πi=k)bk(L)=1, for each possible k>0(3.5)
迭代公式是:
(3.6)
b
k
(
i
)
=
∑
l
a
k
l
e
l
(
x
i
+
1
)
b
l
(
i
+
1
)
b_k(i) = \sum_l a_{kl}e_l(x_{i+1})b_l(i+1) \tag{3.6}
bk(i)=l∑aklel(xi+1)bl(i+1)(3.6)
终止条件是:
(3.7)
P
(
x
)
=
b
0
(
0
)
P(x) = b_0(0) \tag{3.7}
P(x)=b0(0)(3.7)
在实际的计算中,为了解决多个概率相乘可能导致的下溢
问题,要对概率进行适当的缩放。我们选择了缩放因子
这一方法。我们首先定义缩放后的概率:
(3.8)
f
~
l
(
i
)
=
f
l
(
i
)
∏
j
=
1
i
s
j
b
~
l
(
i
)
=
b
l
(
i
)
∏
j
=
i
L
s
j
\tilde{f}_l(i) = \frac{f_l(i)}{\displaystyle \prod_{j=1}^i s_j} \\ \tilde{b}_l(i) = \frac{b_l(i)}{\displaystyle \prod_{j=i}^L s_j} \tag{3.8}
f~l(i)=j=1∏isjfl(i)b~l(i)=j=i∏Lsjbl(i)(3.8)
缩放因子
s
i
s_i
si的计算方法是:
(3.9)
s
i
+
1
=
∑
l
e
l
(
x
i
+
1
)
∑
k
f
~
k
(
i
)
a
k
l
,
when
∑
l
f
~
l
(
i
)
=
1
s_{i+1} = \sum_l e_l(x_{i+1}) \sum_k \tilde{f}_k(i)a_{kl}, \ \ \ \text{when $\sum_l \tilde{f}_l(i) = 1$} \tag{3.9}
si+1=l∑el(xi+1)k∑f~k(i)akl, when ∑lf~l(i)=1(3.9)
并且有:
(3.10)
P
(
x
)
=
∏
j
=
1
L
s
j
P(x) = \prod_{j=1}^L s_j \tag{3.10}
P(x)=j=1∏Lsj(3.10)
用缩放后的概率表示前向算法:
(3.11)
f
~
k
(
0
)
=
{
0
,
if
k
≠
0
1
,
if
k
=
0
s
i
+
1
=
∑
l
e
l
(
x
i
+
1
)
∑
k
f
~
k
(
i
)
a
k
l
f
~
l
(
i
+
1
)
=
1
s
i
+
1
e
l
(
x
i
+
1
)
∑
k
f
~
l
(
i
)
a
k
l
\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}
f~k(0)={0,1,if k̸=0if k=0si+1=l∑el(xi+1)k∑f~k(i)aklf~l(i+1)=si+11el(xi+1)k∑f~l(i)akl(3.11)
用缩放后的概率表示后向算法:
(3.12)
b
~
k
(
L
)
=
1
s
L
b
~
k
(
i
)
=
1
s
i
∑
l
a
k
l
b
~
l
(
i
+
1
)
e
l
(
x
i
+
1
)
\tilde{b}_k(L) = \frac{1}{s_L}\\ \tilde{b}_k(i) = \frac{1}{s_i} \sum_l a_{kl} \tilde{b}_l(i+1)e_l(x_{i+1}) \tag{3.12}
b~k(L)=sL1b~k(i)=si1l∑aklb~l(i+1)el(xi+1)(3.12)
四、后验概率的计算与后验解码
当符号序列已知而路径未知时,我们除了关心最可能路径外,也对某一位置状态的概率$ P(\pi_i=k|x) $感兴趣。很明显,这是一个后验概率
,通过推导,可以通过下面的公式计算:
(4.1)
P
(
π
i
=
k
∣
x
)
=
f
k
(
i
)
b
k
(
i
)
P
(
x
)
P(\pi_i=k|x) = \frac{f_k(i)b_k(i)}{P(x)} \tag{4.1}
P(πi=k∣x)=P(x)fk(i)bk(i)(4.1)
如果利用缩放后的概率计算,上述公式变为:
(4.2)
P
(
π
i
=
k
∣
x
)
=
f
~
k
(
i
)
b
~
k
(
i
)
s
i
P(\pi_i=k|x) = \tilde{f}_k(i) \tilde{b}_k(i) s_i \tag{4.2}
P(πi=k∣x)=f~k(i)b~k(i)si(4.2)
所谓后验解码
,就是对每一个位置,计算得到该位置最有可能的状态。即
(4.3)
π
^
i
=
a
r
g
m
a
x
k
 
P
(
π
i
=
k
∣
x
)
=
a
r
g
m
a
x
k
 
f
~
k
(
i
)
b
~
k
(
i
)
\begin{aligned} \hat{\pi}_i & = \underset{k}{\mathrm{argmax}} \, P(\pi_i=k|x) \\ & = \underset{k}{\mathrm{argmax}} \, \tilde{f}_k(i) \tilde{b}_k(i) \tag{4.3} \end{aligned}
π^i=kargmaxP(πi=k∣x)=kargmaxf~k(i)b~k(i)(4.3)
五、Baum-Welch算法估算HMM模型参数
EM算法
是一种在有缺失数据的情况下利用最大似然法
或最大对数似然法
估算概率模型参数的迭代方法。
(5.1)
θ
^
=
a
r
g
m
a
x
θ
 
P
(
x
∣
θ
)
θ
^
=
a
r
g
m
a
x
θ
 
log
P
(
x
∣
θ
)
\hat{\theta} = \underset{\theta}{\mathrm{argmax}} \, P(x|\theta) \\ \hat{\theta} = \underset{\theta}{\mathrm{argmax}} \, \log P(x|\theta) \tag{5.1}
θ^=θargmaxP(x∣θ)θ^=θargmaxlogP(x∣θ)(5.1)
假设缺失数据是
y
y
y,那么EM算法的步骤就是:
E步骤(Expectation)要计算
Q
Q
Q函数:
(5.2)
Q
(
θ
∣
θ
t
)
=
∑
y
P
(
y
∣
x
,
θ
t
)
log
P
(
x
,
y
∣
θ
)
Q(\theta|\theta^t) = \sum_y P(y|x,\theta^t) \log P(x,y|\theta) \tag{5.2}
Q(θ∣θt)=y∑P(y∣x,θt)logP(x,y∣θ)(5.2)
M步骤(Maximization)根据步骤
t
t
t的结果计算得到步骤
t
+
1
t+1
t+1的参数:
(5.3)
θ
t
+
1
=
a
r
g
m
a
x
θ
 
Q
(
θ
∣
θ
t
)
\theta^{t+1} = \underset{\theta}{\mathrm{argmax}} \, Q(\theta|\theta^t) \tag{5.3}
θt+1=θargmaxQ(θ∣θt)(5.3)
终止条件就是当(对数)似然值变化小于一个阈值
T
T
T或者迭代次数超过最大迭代次数
M
a
x
I
t
e
r
MaxIter
MaxIter,即:
(5.4)
P
(
x
∣
θ
t
+
1
)
−
P
(
x
∣
θ
t
)
<
T
or
log
P
(
x
∣
θ
t
+
1
)
−
log
P
(
x
∣
θ
t
)
<
T
or
t
>
M
a
x
I
t
e
r
\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}
P(x∣θt+1)−P(x∣θt)<Tor logP(x∣θt+1)−logP(x∣θt)<Tor t>MaxIter(5.4)
Baum-Welch算法
是EM算法的一个特例。当符号序列已知而路径未知时,可以用Baum-Welch算法来估算HMM模型的参数。这时,缺失数据就是路径
π
\pi
π。那么,Baum-Welch算法的
Q
Q
Q函数变为:
(5.5)
Q
(
θ
∣
θ
t
)
=
∑
π
P
(
π
∣
x
,
θ
t
)
log
P
(
x
,
π
∣
θ
)
Q(\theta|\theta^t) = \sum_{\pi} P(\pi|x,\theta^t) \log P(x,\pi|\theta) \tag{5.5}
Q(θ∣θt)=π∑P(π∣x,θt)logP(x,π∣θ)(5.5)
HMM模型的参数主要是转移概率
a
k
l
a_{kl}
akl以及发射概率
e
k
(
b
)
e_k(b)
ek(b),可以证明,当Baum-Welch算法采用如下迭代方式计算参数时,可以让对数似然取到局部最大值:
(5.6)
a
k
l
t
+
1
=
A
k
l
t
+
r
k
l
∑
l
′
[
A
k
l
′
t
+
r
k
l
′
]
e
k
t
+
1
(
b
)
=
E
k
t
+
1
(
b
)
+
r
k
(
b
)
∑
b
′
[
E
k
t
+
1
(
b
′
)
+
r
k
(
b
′
)
]
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}
aklt+1=l′∑[Akl′t+rkl′]Aklt+rklekt+1(b)=b′∑[Ekt+1(b′)+rk(b′)]Ekt+1(b)+rk(b)(5.6)
其中,
t
t
t表示迭代的次数,
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)在所有训练序列中发生的期望次数。即
(5.7)
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{5.7} \end{aligned}
Akl=j∑π∑P(πj∣xj,θ)Akl(πj)=j∑i∑P(πij=k,πi+1j=l∣xj,θ)(5.7)
(5.8) 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{5.8} \end{aligned} Ek(b)=j∑π∑P(πj∣xj,θ)Ek(b,πj)=j∑i∑P(πij=k,xij=b∣xj,θ)=j∑{i∣xij=b}∑P(πij=k∣xj,θ)(5.8)
如果用前向算法和后向算法中的符号表示的话,我们可以推导得到:
(5.9)
A
k
l
=
∑
j
1
P
(
x
j
∣
θ
)
∑
i
f
k
j
(
i
)
b
l
j
(
i
+
1
)
a
k
l
e
l
(
x
i
+
1
j
)
=
∑
j
∑
i
f
~
k
j
(
i
)
a
k
l
e
l
(
x
i
+
1
j
)
b
~
l
j
(
i
+
1
)
\begin{aligned} \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{aligned}
Akl=j∑P(xj∣θ)1i∑fkj(i)blj(i+1)aklel(xi+1j)=j∑i∑f~kj(i)aklel(xi+1j)b~lj(i+1)(5.9)
(5.10) E k ( b ) = ∑ j 1 P ( x j ∣ θ ) ∑ { i ∣ x i j = b } f k j ( i ) b k j ( i ) = ∑ j ∑ { i ∣ x i j = b } f ~ k j ( i ) b ~ k j ( i ) s i j \begin{aligned} \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{aligned} Ek(b)=j∑P(xj∣θ)1{i∣xij=b}∑fkj(i)bkj(i)=j∑{i∣xij=b}∑f~kj(i)b~kj(i)sij(5.10)
伪计数之和反映了我们?认为先验知识的可靠程度。如果伪计数之和较大,则我们认为先验概率比较可靠,需要用更多的数据?取改变它。反之不太可靠。最开始的概率参数可以用随机数?。?只要保证相应的概率和为1即可。
至此,序列比对系列文章已经介绍了“第一部分:二序列比对的常见问题和相应算法”以及“第二部分:HMM模型及相关算法简介”。在学习“将HMM模型应用到序列比对(或序列发现)”之前,我们接下来准备先学习一下多序列比对的常见问题和相关算法。
(公众号:生信了)