• 隐马尔科夫模型(一)


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

    1. 模型的定义与约定:

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

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

                                   egin{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 brace$, 且与随机序列$I$一起满足观测独立性

                                  egin{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 imes K$矩阵$A$与$L imes K$矩阵$B$还有向量$piinmathbb{R}^{K}$确定,使得:

                                  egin{equation}A_{ji}=P(i_{t+1}=jmid i_{t}=i),end{equation}

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

                                  egin{equation}B_{alpha i}=P(o_{t}=alphamid i_{t}=i),end{equation}

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

                                 egin{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(Omid lambda)$?

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

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

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

            

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

                                                 egin{equation}P(Omidlambda)=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} riangleq P(o_{1},...,o_{t},i_{t}=imid lambda)$, 对于任意的$i=1,...,K$, $t=1,...,T$,首先我们很容易知道:

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

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

                                egin{equation}egin{split}alpha_{t+1,i}&=P(o_{1},...,o_{t+1},i_{t+1}=imid lambda) ewline &=sum_{j=1}^{K}P(o_{1},...,o_{t+1},i_{t}=j,i_{t+1}=imid lambda) ewline &=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}=imid o_{1},...,o_{t},i_{t}=j,lambda)P(o_{1},...,o_{t},i_{t}=jmid lambda) ewline &=sum_{j=1}^{K}P(o_{t+1}mid i_{t+1}=j,lambda)P(i_{t+1}=imid i_{t}=j,lambda)alpha_{t,j} ewline &=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(Omid lambda)$。

                  算法:

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

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

                                       egin{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(Omid lambda)=sum_{i=1}^{K}alpha_{i,T}$, 输出$P(Omid lambda)$。


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

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

         

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

                                 egin{equation}eta_{t,i} riangleq P(o_{t+1},...,o_{T}mid i_{t}=i)end{equation}

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

                                 egin{equation}eta_{t,i}=sum_{j=1}^{K}eta_{t+1,j}B_{o_{t+1}j}A_{ji}end{equation}

             算法二:


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

                  输出:概率$P(Omid lambda)$。

                  算法:

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

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

                                egin{equation}eta_{t,i}=sum_{j=1}^{K}eta_{t+1,j}B_{o_{t+1}j}A_{ji}end{equation}

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

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


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

  • 相关阅读:
    A Complete Tutorial to Learn Data Science with Python from Scratch
    OpenGL学习--08--基本渲染(灯光)
    OpenGL学习--07--模型加载(obj)
    OpenGL学习--06--键盘与鼠标交互
    OpenGL学习--05--纹理立方体--代码
    OpenGL学习--05--纹理立方体--BMP文件格式详解(转载)
    OpenGL学习—04--彩色立方体
    OpenGL学习--03--矩阵
    OpenGL学习--02--绘制一个红色三角形
    OpenGL学习--01--打开一个窗口
  • 原文地址:https://www.cnblogs.com/szqfreiburger/p/11777856.html
Copyright © 2020-2023  润新知