• 统计学习方法10—隐马尔可夫模型推导


      隐马尔可夫模型(HMM)是一种标注模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型。其在语音识别,自然语言处理,模式识别等领域有着广泛的应用。

    1.基本概念

      友好起见,我们以例子来导出马尔可夫的定义

    • 盒子与球模型
        设有4个盒子,每个盒子里装有红白两种颜色的球。该模型抽取过程定义如下:先等概率选择一个盒子,从中抽取一次得到一个观测结果,然后换盒子,并且换盒子的过程中服从一些概率,比如1号盒子到2、3、4号的概率分别为0.1、0.4、0.5。2号盒子到1、2、3、4号的概率分别为0.3、0.2、0.1、0.4。假设抽取了5次,结果为“红,白,白,红,红”。
        总共抽取了5次,那么得到一个时间长度为5的观测序列,这里”红,白,白,红,红“便是最终的观测序列,其中每次抽取是在不同的盒子中进行的,这5次选择的盒子构成了一个状态随机序列,表示是在什么状态下抽取的。注意模型开始假设是等概率选择一个盒子,这个概率叫初始状态概率(pi)
        设所有可能的状态Q有N种,可能的V观测有M种,为了公式表达方便, 用 (q=i) 表示状态为第(i) 个状态, (q_t=i)表示在 (t) 时刻的状态是第 (i) 个状态,(y_t) 表示第 (t)个时刻的观测。
        其中每个状态(当前盒子)都有转移到另一个状态的概率,这些概率可以方便的用矩阵表示,并且这个矩阵一定是方阵,

    [A=[a_{ij} ] _ {N*N} ]

    其中,

    [a_{ij} = P(q_{(t+1)} =j|q_t = i), i=1,2,...,N;j=1,2,..., ]

    表示在时刻 t 处于状态 i 的条件下在下一时刻 t+1 转移到状态 j 的概率。
      除了状态转移矩阵,要知道还有每个状态下各个观测事件发生的概率,因此也用矩阵B将其表示

    [B = [b_j(k)]_{N*M} ]

    其中

    [b_j(k) = P(y_t = v_k|q_t = j) ]

    表示在状态 (j) 下生成观测(v_k)的概率。
      (pi)表示初始状态概率向量

    [pi = (pi_i) , ]

    其中,(pi = P(q_1 =i)),表示(t = 1)时刻处于状态 (i) 的概率。
      状态转移概率矩阵A,观测概率矩阵B和初始状态概率(pi)构成了隐马尔可夫模型的三要素,常用三元符表示隐马尔可夫模型的参数

    [lambda = (A,B,pi) ]

    1.1 两个重要假设

      隐马尔可夫模型有两个非常重要的假设,后面简化算法的推导都是基于这两个假设

    • 齐次马尔可夫性假设
        即假设隐马尔可夫链在任意时刻(t)的状态只依赖与前一时刻的状态,与其他时刻的装态和观测值无关,也与(t)时刻无关,即得概率简化公式如下

    [P(q_t|y_1,y_2,...,y_{t-1},q_1,q_2,...,q_{t-1})= P(q_t|q_{t-1}) ]

    • 观测独立性假设
        即假设任意时刻的观测只依赖于当前时刻马尔可夫链的状态,而与其他观测和状态无关

    [P(y_t|y_1,y_2,...,y_{t-1},q_1,q_2,...,q_t) = P(y_t|q_t) ]

      总结一下隐马尔可夫的过程,那么假设(lambda)的参数已知,生成一个长度为T的时间序列的过程如下:
      (1) 按照初始状态概率(pi)产生一个状态(q_1)
      (2)令 t = 1
      (3)按照状态(q_t)的观测概率矩阵B生成(y_t)
      (4)安装状态(q_t)的状态转移矩阵A产生下一个时刻的状态。
      (5)(t= t +1), 如果(t < T),转至(3),否则结束。

      大致明白隐马尔可夫模型是什么之后我们需要考虑它是干嘛的,能做什么。事实上隐马尔可夫模型有三个基本问题,解决这三个基本问题的过程也就是解决不同问题的过程,同时其问题描述也很明确,相信看完问题描述之后便对它能做什么有大致的了解。

    • 隐马尔可夫的三个基本问题
      (1) 概率计算问题。给定隐马尔可夫模型的参数(lambda=(A,B,pi))和观测序列(Y=(y_1,y_2,...,y_t)),计算在该模型下观测 序列(Y)出现的概率(P(Y|lambda))
      (2) 学习问题。已知观测序列(Y= (y_1,y_2,...,y_t)),估计模型的参数(lambda=(A,B,pi)),使得该模型下的该观测序列发生的概率(P(Y|lambda))最大,即极大似然估计该模型参数。
      (3) 预测问题,也称为解码(decoding)问题。已知模型(lambda=(A,B,pi))和观测序列(Y=(y_1,y_2,...,y_t)),求使给定序列条件下状态序列的概率(P(Q|Y))最大的状态序列,即给定观测序列,求最有可能生成该观测序列的状态序列。

      后面继续讨论如何计算这些问题以及如何简化这些问题。

    2. (P(Y|lambda))概率计算问题

      本问题可以通过前向和后向算法进行计算,不过先来看看该问题的直接解法,以及该方法为什么不可行。前面已经说过隐马尔可夫有两个基本假设,其计算基本都是基于它们来化简的,先考虑其基本用法,即一个观测序列可以如何简化表达,以三个观测序列为例(P(y_1,y_2,y_3)),其中共有K个状态

    [egin{aligned} P(y_1,y_2,y_3) = & sum_{q_3}^Ksum_{q_2}^Ksum_{q_1}^KP(y_1,y_2,y_3,q_1,q_2,q_3)\ = &sum_{q_3}^Ksum_{q_2}^Ksum_{q_1}^KP(y_3|y_1,y_2,q_1,q_2,q_3)cdot P(y_1,y_2,q_1,q_2,q_3)\ = &sum_{q_3}^Ksum_{q_2}^Ksum_{q_1}^KP(y_3|q_3)cdot P(q_3|y_1,y_2,q_1,q_2)cdot P(y_1,y_2,q_1,q_2)\ =& sum_{q_3}^Ksum_{q_2}^Ksum_{q_1}^KP(y_3|q_3) cdot P(q_3|q_2) cdot P(y_1,y_2,q_1,q_2)\ & cdots cdots\ =& sum_{q_3}^Ksum_{q_2}^Ksum_{q_1}^KP(y_3|q_3) cdot P(q_3|q_2) cdot P(y_2|q_2)cdot P(q_2|q_1) cdot P(y_1|q_1) cdot P(q_1)\ =& sum_{q_3}^Ksum_{q_2}^Ksum_{q_1}^KP(y_3|q_3) cdot P(q_3|q_2) cdot P(y_2|q_2)cdot P(q_2|q_1) cdot P(y_1|q_1) cdot pi(pi_1) end{aligned} ]

      虽然这一方法在直接计算法中没有用到,但是是后面化简都会用到的,所以先写在这儿。

    2.1 直接计算方法

       回忆问题,给定模型参数和一个观测序列,计算这个观测序列出现的概率(P(Y,lambda)),若要直接计算,需考虑我们有哪些已知条件。首先初始状态概率(pi)知道,状态转移概率矩阵A也知道,那么生成和这个观测序列相同长度的状态序列的概率(P(Q|lambda))就能表示出来了

    [P(Q|lambda)=pi_{q_1} a_{q_1q_2}a_{q_2q_3} cdots a_{q_{t-1}q_{t}} ]

      (P(Y|lambda))不能直接表达的原因是中间还有隐变量——转移状态,在固定状态下的观测概率B是已知的,那么已经得到了一串状态序列的概率,在这串状态序列下的观测是能够表示的,这便得到了

    [P(Y|Q,lambda) = b_{q_i}(y_1)cdot b_{q_2}(y_2)cdots b_{q_t}(y_t) ]

      有了这两个概率,隐变量和观测变量的联合概率分布可表示为

    [egin{aligned} P(Y,Q|lambda) =&P(Y|Q,lambda) P(Q|lambda)\ =&pi_{q_1}b_{q_1}(y_1)a_{q_1q_2}b_{q_2}(y_1)cdots a_{q_{t-1}q_t}b_{q_t}(y_t) end{aligned} ]

      对于联合概率分布,可以求解其一个变量的边缘分布的和或积分得到另一个变量的分布,这是机器学习中常见的 手段,应熟练掌握,现对状态序列求和

    [egin{aligned} P(Y|lambda) =& sum_QP(Y|Q,lambda) P(Q|lambda)\ =& sum_{q_t}^K cdots sum_{q_1}^Kpi_{q_1}b_{q_1}(y_1)a_{q_1q_2}b_{q_2}(y_1)cdots a_{q_{t-1}q_t}b_{q_t}(y_t) end{aligned} ]

      这个计算量是非常大的,T个观测序列,每个序列有K种可能的状态,且内部还有T个乘积需要计算,相当于T个for循环,每个循环执行K次,每次的复杂度T,那么总复杂度(O(TK^T))

    2.2 前向算法

      为了简化,首先定义了前向概率表达,对于隐马尔可夫模型(lambda),定义在时刻 t 的观测序列为((y_1,y_2,...,y_t))且状态为(q_t = i)的概率为前向概率(alpha_t(i)),即

    [alpha_t(i) = P(y_1,y_2,...,y_t,q_t = i |lambda) ]

      下面通过这个前向概率推导(P(Y|lambda))的递推表达式

    [egin{aligned} alpha_1(i) = & P(y_1,q_1 = i | lambda)\ =&pi(pi_i)bi(y_1)\ ,&\ alpha_2(i)=&P(y_1,y_2,q_2 = i)\ =&sum_jP(y_1,y_2,q_2 = i,q_1 = j)\ =&sum_jP(y_2|q_2 = i)P(q_2 = i|q_1 =j)cdot alpha_1(j)\ =&P(y_2|q_2)sum_jP(q_2 = i|q_1 = j) cdot alpha_1(j)\ &cdots\ alpha_t(i)=&P(y_t|q_t = i)sum_jP(q_t = i|q_{t-1} = j) cdot alpha_{t-1}(j)\ =&b_i(y_t)sum_ja_{ji}cdot alpha_{t-1}(j) end{aligned} ]

    这是我之前想的推导方法,但不得不说是比较蠢的,由定义观察式子中少了什么多了什么即可,法2

    [egin{aligned} alpha_t(i) = &P(y_1,cdots,y_t,q_t = i|lambda)\ =& sum_j P(y_1,cdots,y_t,q_{t-1} = j,q_t = i|lambda)\ =& sum_j P(y_t|q_t=i)P(q_t = i|q_{t-1}=j)P(y_1,cdots,y_{t-1},q_{t-1}=j|lambda)\ =&sum_jb_i(y_t) a_{ji}alpha_{t-1}(j) end{aligned} ]

      注意求第二个前向概率的时候,为了化简式子,引入了(q_1)但将它当作边缘概率求和去掉了。这个递推式就这样神奇的得到了 t 时刻状态为 (q = i) 的概率,得到t 时刻的前向概率的表达式后,根据它的定义(alpha_T(i) = P(y_1,y_2,...,y_T,q_t = i|lambda))可知,计算(P(Y|lambda))只需要将 t 时刻的所有状态的概率求和就可以了(边缘概率)

    [P(Y|lambda) = sum_i^Kalpha_T(i) ]

      而且这个递推式极大的简化了计算量,因为在计算下一个时刻的前向概率的时候,上一个时刻的前向概率是已经算出来了的,只需做少量乘法,最后的复杂度为(O(KT))

    2.3 后向算法

      明白前向算法的推导过程后,后向算法的思想其实是一样的,并且得到的结果都一样,只不过后向是从后面往前面推,前向可与后向算法组合在一起表达(P(Y|lambda))
    定义:
      给定隐马尔可夫模型(lambda),定义在 t 时刻 且状态为(q_t = i)的条件下,从 t + 1 时刻到 T 时刻的观测序列的概率为后向概率,即

    [eta_t(i) = P(y_{t+1},y_{t+2},...,y_T| q_t = i, lambda) ]

      注意观测数据是从 t + 1 时刻开始的,并且(eta_t(i) = 1)

    [egin{aligned} eta_T(i) = & 1\ ,&\ eta_{T-1}(i)=&P(y_T|q_{T-1} = i,lambda)\ =&sum_{j}^KP(y_T,q_T=j|q_{T-1} = i,lambda)\ =&sum_j^KP(y_T|q_T =j)P(q_T = j|q_{T-1} =i)\ =&sum_j^Kb_j(y_T)a_{ij} eta_T(j)\ &,\ eta_{T-2}(i)=&P(y_{T-1},y_T|q_{T-2} = i, lambda)\ =&sum_{j}^K P(y_{T-1},y_T,q_{T-1} = j|q_{T-2} = i, lambda)\ (乘法公式)=&sum_{j}^K P(y_T|q_{T-1} = j)cdot P(y_{T-1}|q_{T-1}=j)cdot P(q_{T-1}=j|q_{T-2} = i,lambda)\ =&sum_j^K eta_{T-1}(j)cdot b_j(y_{T-1})a_{ij}\ &cdots\ eta_t(i)=&sum_j^Keta_{t+1}(j)cdot b_j(y_{t+1})cdot a_{ij} end{aligned} ]

      和上面一样,法2,由定义,补充一个(q_{t+1})即可

    [egin{aligned} eta_t(i) = &P(y_{t+1},y_{t+2},cdots,y_T|q_t = i,lambda)\ =&sum_jP(y_{t+1},y_{t+2},cdots,y_T,q_{t+1}=j|q_t = i,lambda)\ =& sum_jP(y_{t+1}|q_{t+1}=j)P(q_{t+1}=j|q_t=i)P(y_{t+2},cdots,y_T|q_{t+1} =j,lambda)\ =&sum_j b_j(y_{t+1})a_{ij}eta_{t+1}(j) end{aligned} ]

      同样,得到后向概率的表达式后,根据其定义(eta_t(i) = P(y_{t+1},y_{t+2},...,y_T| q_t = i, lambda)),所求序列为1-T,但t 至少为1 ,这使得该表达式缺少了第一个观测值的概率,不过这很简单,乘上(pi_i b_{i}(y_1))即可,通过后向概率得到(P(Y|lambda))

    [P(Y|lambda) = sum_i^Kpi_i b_i(y_1)eta_1(i) ]

      从刚刚这个求和运算中发现后向概率的定义从 t + 1 时刻开始似乎不方便,但是当它和前向概率结合时,就会发现,应当如此!

    2.4 通过前向与后向概率表达两个重要概率和三个期望

      (1)计算(P(q_t = i|Y,lambda),Y = (y_1,y_2,...y_T))时,即计算给定一串序列情况下,其 t 时刻的状态为 i 的几率,记为(gamma_t(i))。利用前向与后向概率,先计算t 时刻状态与观测的联合分布

    [egin{aligned} gamma_t(i)=P(Y,q_t = i | lambda) = &P(Y|q_t = i)cdot P(q_t = i)\ =& P(y_1,cdots,y_t|q_t = i)cdot P(y_{t+1},cdots ,y_T|q_t = i)cdot P(q_t = i)\ =& P(y_1,cdots,y_t,q_t = i)cdot P(y_{t+1},cdots ,y_T|q_t = i)\ =& alpha_t(i)cdot eta_t(i) end{aligned} ]

      即序列中某个时刻 t 的状态与观测的联合分布可用前向与后向拼接而成,由该联合分布可得观测的分布

    [P(Y|lambda) = sum_i^KP(Y,q_t = i|lambda)=sum_i^Kalpha_t(i)eta_t(i) ]

      再根据条件概率或乘法公式

    [gamma_t(i)=P(q_t = i|Y,lambda) =frac {P(Y,q_t = i|lambda)} {P(Y|lambda)}= frac {alpha_t (i) eta_t(i)} {sum_ialpha_t(i) eta_t(i)} ]

      (2)给定模型参数和观测序列Y,求在时刻 t 处于状态 i 且在时刻 t + 1 处于状态 j 的概率,记为(xi_t(i,j)),大概已经找到窍门了,就是通过其联合概率和观测概率

    [egin{aligned} xi_t(i,j)=P(q_t =i,q_{t+1}=j|Y,lambda) = & frac {P(q_t =i ,q_{t+1} = j,Y, lambda)} {P(Y|lambda)}\ =& frac {P(q_t =i ,q_{t+1} = j,Y, lambda)} {sum_i^Ksum_j^KP(q_t =i ,q_{t+1} = j,Y, lambda)}\ end{aligned} ]

    其中,

    [egin{aligned} P(&q_t =i ,q_{t+1} = j,Y, lambda)\ =&P(Y|q_t=i,q_{t+1} = j)P(q_t=i,q_{t+1} = j)\ =&P(y_T,y_{T-1},cdots,y_{t+1}|q_t=i,q_{t+1}=j)P(y_t,cdots,y_1|q_t=i,q_{t+1}=j)P(q_{t+1}=j,q_t=i)P(q_t=i)\ =&P(y_T,y_{T-1},cdots,y_{T+2}|q_{t+1}=j)P(y_{T+1}|q_{t+1} = j)P(y_T,cdots,y_1,q_t=i)P(q_{t+1}=j,q_t = i)\ =&eta_{t+1}(j)b_j(y_{t+1})alpha_t(i)a_{ij} end{aligned} ]

      此过程中应仔细考虑马尔可夫的两个基本假设,确定其中哪些变量是相互独立的,还有哪些是我们之前已经求出来的。这里以 t 和 t + 1 为界将观测量分开,这样时刻 t 和 时刻 t + 1 的状态都只能作用 于其中一边了。带入原式

    [xi_t(i,j)=frac {alpha_t(i)a_{ij}b_j(y_{t+1})eta_{t+1}(j)} { sum_i^Ksum_j^Kalpha_t(i)a_{ij}b_j(y_{t+1})eta_{t+1}(j)} ]

    (3)上面计算出的两个概率求和可以方便的表示一些有用的期望
       1> 在观测Y下状态 i 出现的期望

    [=sum_t^Tgamma_t(i) = sum_t^TP(q_t=i|Y,lambda) ]

      2> 在观测Y下由状态 i 转移的期望,即前 T- 1个时刻有过状态 i

    [= sum_t^{T-1} gamma_t (i) = sum_t^{T-1}P(q_t = i | Y, lambda) ]

       3>在观测Y下由状态 i 转移到状态 j 的期望

    [=sum_t^{T-1} xi _t(i,j) = sum_i^{T-1} P(q_t = i,q_{t+1} = j|Y, lambda) ]

    3. 学习算法(EM)

      对于学习算法,可分为知道状态序列和不知道状态序列,知道状态序列的计算可直接用极大似然估计经验概率。这里就不说了,一般都是不知道状态序列的,这就和上一篇讲的EM算法一致了,即包含隐变量的概率模型的学习。隐马尔可夫的学习算法叫Baum-Welch,不过原理和EM是一致的,只是因为那时候EM算法还未成体系。

    • EM估计

      在隐马尔可夫中,模型参数是(lambda= (A,B,pi)),观测序列(Y)便是观测数据,而状态转移序列(Q)作为不可观测的隐数据,这样便确立了EM的结构,下面只需按EM算法的步骤计算即可。(按理说初始状态产生的概率也应算作隐变量,但事实上状态序列的第一个已经包含它,并且在后面的计算中状态转移都是依赖于(pi)的,可同时将其计算出来)
      首先,确立完全数据的对数似然函数

    [L(lambda,Q) = logP(Y,Q|lambda) ]

    E-Step:
      E步求对数似然函数关于 隐变量 Q (状态序列)的条件后验概率的期望,但在隐马尔可夫模型中,并未用关于隐变量Q的条件后验概率的期望,而是用 关于 观测序列 Y 和 状态序列的联合后验概率的期望,可以这么做的原因是联合概率等于观测概率 * 隐变量的条件概率——(P(Y,Q|ar lambda) = P(Q|Y,ar lambda)P(Y|ar lambda)),而(P(Y|ar lambda))是常数,并不影响对似然函数的极大化。至于为什么这么做,当然是为了化简后面的结果——用前面推导出的容易表示的概率和期望。于是Q函数表示为

    [Q(lambda,ar lambda) = sum_Q(Y,Q|ar lambda)logP(Y,Q|lambda) ]

      其中(Q = (q_1,q_2,cdots ,q_t)),表示有 t 个求和运算,log前是参数已知的概率,实际要优化的是后面参数未知的(lambda),而

    [P(Y,Q|lambda) = pi_{q_1} prod_{t=1}^{T-1}a_{q_tq_{t+1}}prod_{t = 1}^Tb_{q_t}(y_t) ]

      于是,

    [Q(lambda,ar lambda) = sum_QP(Y,Q|ar lambda)left { logpi_{q_1} + sum_{t=1}^{T-1}loga_{q_tq_{t+1}} + sum_{t=1}^T log b_{q_t}(y_t) ight } ]

    M-Step:
      得到Q函数后就可以进行M步求解模型参数

    [widehat lambda = arg underset lambda {max} Q(lambda,ar lambda) ]

      对于这个Q函数,由于(lambda)的三个参数都是互相分离的,因此可以分开极大化求解

      (1)对于第1 项

    [egin{aligned} sum_QP(Y,Q|ar lambda)logpi_{q_q} = & sum_{q_1}cdots sum_{q_t}P(Y,Q|ar lambda)logpi_{q_1}\ =&sum_{q_1}logpi_{q_1}sum_{q_2}cdots sum_{q_t}P(Y,q_1,cdots,q_t|ar lambda)\ =&sum_{q_1}P(Y,q_1|ar lambda) log pi_{q_1} end{aligned} ]

      注意log 函数中只与 状态序列中第一个有关,于是可以提到 第二个状态序列的求和前面,而后面的求和就是常见的边缘概率的求和=1,相当于把那部分变量积分消去了,这时添加(sum_ipi_i =1)的约束,利用拉格朗日乘数法计算极大点,这里求偏导时其实就是对每个(pi_i)求偏导,也就是说有 N 个等式都得为0 ,然后分别求(pi_i)

    [egin{aligned} frac {partial sum_i^NP(Y,q_1 = i|ar lambda)logpi_{q_1}+gamma(sum_i^Npi_i - 1) } {partial pi_i}=&0\ P(Y,q_1 = i| ar lambda) + gamma pi_i=& 0\ sum_i^N P(Y, q_1 = i| ar lambda) + gamma sum_i^N pi_i=&0\ gamma=&-P(Y|ar lambda) end{aligned} ]

      (gamma)带回到上面等式第二步,

    [pi_i = frac { P(Y,q_1 = i|ar lambda)} {P(Y|ar lambda)}\ = frac {alpha_1(i) eta_1(i)} {sum_i^Nalpha_t(i)}\ =gamma_1(i) ]

      其中分母也可用后向概率表示,或是后向与前向组合,注意分子被前面得到的前向后向概率简单的表示出来,这便是开始选择Q函数的时候为什么选择联合概率的原因。
      (2)** 对于第二项**

    [egin{aligned} sum_QP(Y,Q|ar lambda)sum_{t=1}^{T-1} loga_{q_tq_{t+1}}=& sum_{q_1} cdots sum_{q_t} P(Y,Q|ar lambda)sum_{t=1}^{T-1} log a_{q_tq_{t+1}}\ =&sum_isum_jP(Y,q_t = i,q_{t +1} =j|ar lambda)sum_{t=1}^{T-1} log a_{ij} end{aligned} ]

      原理与第一项是一样的,虽是对每个状态变量都要求和,但是当 t 确定时,求和中只有时刻 t 和与它相邻的 t + 1 时刻的状态有关,因此外面的T个求和运算总是只有两个有效,然后添加关于(a_{ij})的约束(sum_j a_{ij}= 1)构造拉格朗日即可

    [egin{aligned} 0=&frac partial {partial a_{ij}} left { sum_isum_jP(Y,q_t = i,q_{t +1} =j|ar lambda)sum_{t=1}^{T-1} log a_{ij} + eta( sum_ja_{ij} -1) ight } \ 0=&sum_{t-1}^{T-1}P(Y,q_t =i,q_{t+1} =j|ar lambda) + eta a_{ij}\ 0=&sum_j left { sum_{t-1}^{T-1}P(Y,q_t =i,q_{t+1} =j|ar lambda) + eta a_{ij} ight }\ 0=&sum_{t=1} ^{T-1} P(Y,q_t =i | ar lambda) + eta\ eta=&-sum_{t=1} ^{T-1} P(Y,q_t =i | ar lambda) end{aligned} ]

    代回上式第二步,

    [egin{aligned} a_{ij} = &frac { sum_{t-1}^{T-1}P(Y,q_t =i,q_{t+1} =j|ar lambda) } { sum_{t=1} ^{T-1} P(Y,q_t =i | ar lambda) }\ =&frac {sum_t^{T-1} xi_t(i,j) } { sum_t^{T-1} gamma_t(i) } end{aligned} ]

       (3) 对于第三项

    [sum_QP(Y,Q|ar lambda) sum_t b_{q_t}(y_t) = sum_jP(Y,q_t = j|ar lambda)sum_tb_j(y_t) ]

      求解方法相同,这里不赘述,只需要注意(b_j(y_t))偏导时不止要保证 j 相同就不为0,还需保证观测值也相同,可用(I(y_t = k))表示,结果为

    [b_j(k) = frac { sum_t P(Y,q_t = j| ar lambda) I(y_t = k) } { sum_tP(Y,q_t = j | ar lambda) } \ =frac { sum_{t=1,y_t = k}^T gamma_t (j) } { sum_t^Tgamma_t(j) } ]

      这些结果最后都可以用前向后向的简化而来的期望进行计算和表达。

    4.预测算法

      隐马尔可夫的预测是指给定模型参数和已知的观测序列,求解最有可能的状态序列,所以也称为解码运算(decoding)。下面介绍用于预测的近似算法和维特比算法(Viterbi algorithm)。

    4.1 近似算法

      近似算法是不考虑状态之间的互相影响而简化的一种算法,它的基本思想是分别选取每个时刻 t 最有可能出现的状态 (q_i),从而得到一个状态序列。而前面我们已经将 t 时刻最有可能出现的概率表示出了

    [gamma_t(i) = frac { alpha_t(i) eta_t(i) } {P(Y|lambda)} = frac {alpha_t(i) eta_t(i) } { sum_j alpha_t(j) eta_t(j)} ]

    于是,t 时刻最有可能的状态是

    [q_t^* = argunderset i {max} [gamma_t(i) ] ]

      对 T 个时刻依次求解即可得到状态序列,从求解过程中也可以看到,每个状态只是单独的用观测序列进行估计,并未考虑状态序列之间的整体影响和概率最大情况。但近似算法计算简单,并在有些场景仍可使用。

    4.2 维特比算法

      维特比算法采用动态规划求解隐马尔可夫模型的状态序列,即从初始时刻开始,依次计算到每个状态的概率,保存到当前时刻的每个状态最大的概率的上一个状态是什么,直到T时刻时,便计算出了所有状态的最大概率,选择概率最大的那个状态,并从该状态回溯,得到其状态序列,那么该序列便是总概率最大的状态序列。其实就是贪心的思想,先求解最优子问题。
      根据刚刚的分析,该问题需要计算的有两个,一是当前时刻是状态 i 的最大概率,二是当前时刻是状态 i 的最大概率是由上个时刻哪个状态得到的。

    • 定义

    (1) . 在时刻 t 状态为 i 的状态序列的概率最大值为(注意 时刻 t 前的序列都已确定)

    [delta_t(i) = underset {q_1,cdots ,q_{t-1}} {max} P(q_t = i,q_{t-1},cdots,q_1,Y|lambda) ]

      那么无论是通过定义,还是考虑这是一个递归过程,都能得到

    [delta_{t+1} (i) = underset {q_1,cdots ,q_{t}} {max} P(t_{t+1} = i,q_t,cdots,q_1,y_{t+1},cdots,y_1|lambda)\ =underset {0<j<N+1} {max}[ delta_t(j)a_{ji}b_i(y_{t+1}) ] ]

    (2) . 在时刻 t 状态为 i 的概率最大的状态序列的上一个时刻的状态为

    [Psi_t(i) = arg underset {0<j<N+1} {max}[delta_{t-1}(j)a_{ji}] ]

      注意求上一个时刻的状态时不需要乘发射概率,因为当前时刻 t 的状态已确定,与观测无关。

    算法过程:
      需要计算的量和贪心策略确定后,算法过程也就比较简单了。
      (1)初始化

    [delta_1(i) = pi_ib_i(y_1)\ Psi_1(i) = 0 ]

      (2)递推,t = 2, 3, ... , T

    [delta_t(i) = =underset {0<j<N+1} {max}[ delta_t(j)a_{ji}b_i(y_{t+1}) ]\ Psi_t(i) = arg underset {0<j<N+1} {max}[delta_{t-1}(j)a_{ji}] ]

      (3)停止

    [P^* = underset{0<i<N+1} {max} delta_T(i)\ q_T^* = arg underset {0<i<N+1} {max} delta_T(i) ]

      (4)回溯 ,t = T-1,..., 1

    [q_t^* = Psi_{t+1} (q_{t+1}) ]

      算法完成便得到一个状态序列,这个序列对于观测序列来说是概率最大的。

  • 相关阅读:
    软件性能测试指标及其注意地方
    Oracle过程及函数的参数模式详解
    【转】Web Service单元测试工具实例介绍之SoapUI
    【转】如何读懂Oracle文档中的语法图
    浅谈session测试
    Cookie管理工具
    php 在linux 用file_exists() 函数判断 另外一台服务器映射过来的文件是否存在 总是返回false
    SecureCRT 设置字体跟颜色
    bootstrat 设置 select option 选项的值
    php 如何把中文写入json中 当json文件中还显示的是中文
  • 原文地址:https://www.cnblogs.com/breezezz/p/11180911.html
Copyright © 2020-2023  润新知