美文网首页语音识别NLP大杂烩
HMM学习最佳范例六:维特比算法5

HMM学习最佳范例六:维特比算法5

作者: 04282aba96e3 | 来源:发表于2017-11-20 09:52 被阅读4次

    六、维特比算法(Viterbi Algorithm)

    维特比算法程序示例

    仍然需要说明的是,本节不是这个系列的翻译,而是作为维特比算法这一章的补充,将UMDHMM这个C语言版本的HMM工具包中的维特比算法程序展示给大家,并运行包中所附带的例子。关于UMDHMM这个工具包的介绍,大家可以参考前向算法4中的介绍。

    维特比算法程序示例如下(在viterbi.c中):
    void Viterbi(HMM *phmm, int T, int *O, double **delta, int **psi,int *q, double pprob)
    {
      int i, j; /
    state indices /
      int t; /
    time index */

    int maxvalind;
      double maxval, val;

    /* 1. Initialization */

    for (i = 1; i <= phmm->N; i++)
      {
        delta[1][i] = phmm->pi[i] * (phmm->B[i][O[1]]);
        psi[1][i] = 0;
      }

    /* 2. Recursion /
      for (t = 2; t <= T; t++)   {     for (j = 1; j <= phmm->N; j++)
        {
          maxval = 0.0;
          maxvalind = 1;
          for (i = 1; i <= phmm->N; i++)
          {
            val = delta[t-1][i]
    (phmm->A[i][j]);
            if (val > maxval)
            {
              maxval = val;
              maxvalind = i;
            }
          }

    delta[t][j] = maxval*(phmm->B[j][O[t]]);
          psi[t][j] = maxvalind;

    }
      }

    /* 3. Termination */

    *pprob = 0.0;
      q[T] = 1;
      for (i = 1; i <= phmm->N; i++)
      {
        if (delta[T][i] > pprob)
        {
          
    pprob = delta[T][i];
          q[T] = i;
        }
      }

    /* 4. Path (state sequence) backtracking */

    for (t = T - 1; t >= 1; t--)
        q[t] = psi[t+1][q[t+1]];

    }

    在UMDHMM包中所生成的4个可执行程序中,testvit是用来测试维特比算法的, 对于给定的观察符号序列及HMM,利用Viterbi 算法生成最可能的隐藏状态序列。这里我们利用UMDHMM包中test.hmm和test.seq来测试维特比算法,关于这两个文件,具体如下:
      test.hmm:


    M= 2
        N= 3
        A:
        0.333 0.333 0.333
        0.333 0.333 0.333
        0.333 0.333 0.333
        B:
        0.5 0.5
        0.75 0.25
        0.25 0.75
        pi:
        0.333 0.333 0.333


    test.seq:

    T= 10
        1 1 1 1 2 1 2 2 2 2


    对于维特比算法的测试程序testvit来说,运行:
       testvit test.hmm test.seq
      结果如下:
      ------------------------------------
      Viterbi using direct probabilities
      Viterbi MLE log prob = -1.387295E+01
      Optimal state sequence:
      T= 10
      2 2 2 2 3 2 3 3 3 3
      ------------------------------------
      Viterbi using log probabilities
      Viterbi MLE log prob = -1.387295E+01
      Optimal state sequence:
      T= 10
      2 2 2 2 3 2 3 3 3 3
      ------------------------------------
      The two log probabilites and optimal state sequences
      should identical (within numerical precision).

    序列“2 2 2 2 3 2 3 3 3 3”就是最终所找到的隐藏状态序列。好了,维特比算法这一章就到此为止了。

    相关文章

      网友评论

        本文标题:HMM学习最佳范例六:维特比算法5

        本文链接:https://www.haomeiwen.com/subject/dxwmvxtx.html