隐马尔科夫模型(一)

 

        隐马尔科夫模型是一种序列模型,广泛应用于自然语言处理,语音识别,生物信息等领域。

 

1. 模型的定义与约定:

 

       定义一:一个隐马尔科夫模型指的是如下的两个随机序列$I,O$:

       1)一个不可观测随机序列:$I=(i_{1},...,i_{T})$, 可以取值状态集合$Q=\lbrace 1,...,K\rbrace$, 并且满足齐次马尔科夫性

                               \begin{equation}P(i_{t+1}\mid i_{t},i_{t-1},...,i_{1})=P(i_{t+1}\mid i_{t}), \end{equation}

与$t$无关

 

       2) 一个可观测随机序列:$O=(o_{1},...,o_{T})$, 可以取值的状态集合$V=\lbrace 1,...,L\rbrace$, 且与随机序列$I$一起满足观测独立性

                              \begin{equation}P(o_{t}\mid i_{t},i_{t-1},o_{t-1},...,i_{1},o_{1})=P(o_{t}\mid i_{t})\end{equation}

与$t$无关

 

     由以上的定义可以知道,一个隐马尔科夫模型完全由相应的$K\times K$矩阵$A$与$L\times K$矩阵$B$还有向量$\pi\in\mathbb{R}^{K}$确定,使得:

                              \begin{equation}A_{ji}=P(i_{t+1}=j\mid i_{t}=i),\end{equation}

对任意的$i,j=1,...,K$, $t=1,...,T-1$, 并且:

                              \begin{equation}B_{\alpha i}=P(o_{t}=\alpha\mid i_{t}=i),\end{equation}

对任意的$\alpha=1,...,L$,$i=1,...,K$,$t=1,...,T$(这里我们用希腊字母表示可观测状态,而用拉丁字母表示不可观测状态), 且:

                             \begin{equation}\pi_{i}=P(i_{1}=i),\end{equation}

所以我们今后也约定:"一个具有参数$\lambda=(A,B,\pi)$的隐马尔科夫模型" 为一个满足上述条件(3)-(5)的隐马尔科夫模型。

 

 

2.隐马尔科夫链的几大基本问题

 

        现在我们自然地会问如下三个基本问题:

       1)概率计算问题:给定模型参数$\lambda=(A,B,\pi)$ 以及某个观测序列$O=(0_{1},...,0_{T})$, 如何高效地计算出概率$P(O\mid \lambda)$?

       2)学习问题:已知某个观测序列$O=(o_{1},...,o_{T})$, 如何得到参数$\lambda=(A,B,\pi)$使得似然函数$P(O\mid\lambda)$极大,或者至少尽量大?

       3)预测问题:预测问题,也成为解码问题(Decoding Problem),也就是已知观测序列$O=(o_{1},...,o_{T})$, 以及参数$\lambda=(A,B,\pi)$, 求不可观测序列$I$使得概率: \begin{equation}P(I\mid O,\lambda)\end{equation}极大。

 

 

3.概率计算的直接算法:

        

       对于第一个问题,概率计算问题,我们由条件(1),(2)我们很容易得到理论上的概率计算公式:

                                             \begin{equation}P(O\mid\lambda)=\sum_{I=(i_{1},...,i_{T})}A_{i_{T}i_{T-1}}...A_{i_{3}i_{2}}A_{i_{2}i_{1}}B_{o_{T}i_{T}}...B_{o_{2}i_{2}}B_{o_{1}i_{1}}\end{equation}

    很容易知道这种算法如果交给计算机执行,其时间复杂度为$O(TK^{T})$, 是一种糟糕的算法。

 

 

4. 概率计算的前向算法

       

       下面介绍一种前向迭代算法:

              我们定义$\alpha_{t,i}\triangleq P(o_{1},...,o_{t},i_{t}=i\mid \lambda)$, 对于任意的$i=1,...,K$, $t=1,...,T$,首先我们很容易知道:

                            \begin{equation}\alpha_{1,i}=B_{o_{1}i}\pi_{i},\end{equation}

对任意的$i=1,...,K$。并且迭代步骤中, 结合假设(1),(2)我们可以计算:

                            \begin{equation}\begin{split}\alpha_{t+1,i}&=P(o_{1},...,o_{t+1},i_{t+1}=i\mid \lambda)\newline &=\sum_{j=1}^{K}P(o_{1},...,o_{t+1},i_{t}=j,i_{t+1}=i\mid \lambda)\newline &=\sum_{j=1}^{K}P(o_{t+1}\mid o_{1},...,o_{t},i_{t}=j,i_{t+1}=i,\lambda)P(i_{t+1}=i\mid o_{1},...,o_{t},i_{t}=j,\lambda)P(o_{1},...,o_{t},i_{t}=j\mid \lambda)\newline &=\sum_{j=1}^{K}P(o_{t+1}\mid i_{t+1}=j,\lambda)P(i_{t+1}=i\mid i_{t}=j,\lambda)\alpha_{t,j}\newline &=\sum_{j=1}^{K}B_{o_{t+1}i}A_{ij}\alpha_{t,j}\end{split}\end{equation}

       于是我们可以总结出前向算法计算概率:

 

        算法一:


              输入:某带有参数$\lambda=(A,B,\pi)$的隐马尔科夫模型,某观测序列$O=(o_{1},...,o_{T})$;

              输出:概率$P(O\mid \lambda)$。

              算法:

              Step1:对$i=1,...,K$, 计算$\alpha_{i,t}=B_{o_{1}i}\pi_{i}$;

              Step2:对任意$t=2,...,T$, 我们计算:

                                   \begin{equation}\alpha_{i,t}=\sum_{j=1}^{K}B_{o_{t}i}A_{ij}\alpha_{j,t-1},\end{equation}

                            其中$i=1,...,K$;

              Step3:计算$P(O\mid \lambda)=\sum_{i=1}^{K}\alpha_{i,T}$, 输出$P(O\mid \lambda)$。


       容易看出该算法的时间复杂度为$O(K^{2}T)$, 空间复杂度为$O(KT)$。       

 

 

5.概率计算的后向算法:

     

     下面看一种方向相反的算法。这时候我们定义后向概率:

                             \begin{equation}\beta_{t,i}\triangleq P(o_{t+1},...,o_{T}\mid i_{t}=i)\end{equation}

         这时候$\beta_{T,i}=1$,且与前向算法相反的是$\beta_{t,i}$由$\beta_{t+1,j}$递推得到,容易计算:

                             \begin{equation}\beta_{t,i}=\sum_{j=1}^{K}\beta_{t+1,j}B_{o_{t+1}j}A_{ji}\end{equation}

 

         算法二:


 

              输入:某带有参数$\lambda=(A,B,\pi)$的隐马尔科夫模型,某观测序列$O=(o_{1},...,o_{T})$;

              输出:概率$P(O\mid \lambda)$。

              算法:

              Step1:对$i=1,...,K$,  令$\beta_{T,i}=1$;

              Step2:对任意$t=T-1,...,1$, 我们计算:

                            \begin{equation}\beta_{t,i}=\sum_{j=1}^{K}\beta_{t+1,j}B_{o_{t+1}j}A_{ji}\end{equation}

                           其中$i=1,...,K$;

              Step3:计算$P(O\mid \lambda)=\sum_{i=1}^{K}B_{o_{1}i}\beta_{1,i}\pi_{i}$, 输出$P(O\mid \lambda)$。

 


 

       该算法的时间复杂度为$O(K^{2}T)$, 空间复杂度为$O(KT)$。    

 

posted @ 2019-11-01 22:49  Freiburger  阅读(238)  评论(0编辑  收藏  举报