隐马尔可夫模型(六)——隐马尔可夫模型的评估问题(前向后向相结合算法)(转载)

重新回顾:

前向变量αt(i):在时刻t,在已知模型μ=(A,B,π)的条件下,状态处于si,输出序列为O102...Ot,前向变量为αt(i)

后向变量βt(i):在时刻t,在已知模型μ=(A,B,π)和状态处于si的条件下,输出序列为Ot+1Ot+2...OT,后向变量为βt(i)

公式推导:

P(O,qt=si|μ) = P(O1O2...OT, qt=si|μ)

=P(O1O2...Ot, qt=si,Ot+1Ot+2...OT|μ)

=P(O1O2...Ot, qt=si|μ) * P(Ot+1Ot+2...OT|O1O2...Ot, qt=si,μ)

=P(O1O2...Ot, qt=si|μ) * P(Ot+1Ot+2...OT|qt=si,μ)

t(i) *  βt(i)

P(O|μ)=

案例分析:

分析:

P(q4=s3|O,M) =  P(q4=s3, O|M)/P(O|M)

= P(O,q4=s3|M)/P(O|M)

= α4(3) *  β4(3)/  

   程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
        float a[3][3] = {{0.5,0.2,0.3},{0.3,0.5,0.2},{0.2,0.3,0.5}};
        float b[3][2] = {{0.5,0.5},{0.4,0.6},{0.7,0.3}};
        float result_b[8][3];
        float result_f[8][3];
        float result, result_t;
        int list[8] = {0,1,0,0,1,0,1,1};
        result_b[7][0] = 1;
        result_b[7][1] = 1;
        result_b[7][2] = 1;
        result_f[0][0] = 0.2 * 0.5;
        result_f[0][1] = 0.4 * 0.4;
        result_f[0][2] = 0.4 * 0.7;
        //Backward
        int i,j,k, count = 7;
        for (i=6; i>=0; i--)
        {
            for(j=0; j<=2; j++)
            {
                result_b[i][j] = 0;
                for(k=0; k<=2; k++)
                {
                   result_b[i][j] += result_b[i+1][k] * a[j][k] * b[k][list[count]];
                }
            }
            count -= 1;
        }
       for (i=0; i<=7; i++)
        {
            for(j=0; j<=2; j++)
            {
                printf("b[%d][%d]= %f\n",i+1,j+1, result_b[i][j]);

            }
        }
        printf("Backward:%f\n", result_b[0][0]*0.2*0.5+result_b[0][1]*0.4*0.4+result_b[0][2]*0.4*0.7);
        //Forward
        count = 1;
        for (i=1; i<=7; i++)
        {
            for(j=0; j<=2; j++)
            {
                result_f[i][j] = 0;
                for(k=0; k<=2; k++)
                {
                    result_f[i][j] += result_f[i-1][k] * a[k][j] * b[j][list[count]];
                }
            }
            count += 1;
        }
        for (i=0; i<=7; i++)
        {
            for(j=0; j<=2; j++)
            {
                printf("a[%d][%d]= %f\n", i+1, j+1, result_f[i][j]);
            }
        }
        result = result_f[7][0] + result_f[7][1] + result_f[7][2];
        printf("Forward: %f\n", result);

        result_t = 0;
        for (i=0; i<=2; i++)
        {
            result_t += result_f[3][i] * result_b[3][i];
        }
        printf("Result:%f\n", result_f[3][2]*result_b[3][2]/result_t);

        return 0;
}

        运行结果

                

时间: 2024-10-05 20:02:59

隐马尔可夫模型(六)——隐马尔可夫模型的评估问题(前向后向相结合算法)(转载)的相关文章

马尔科夫链和隐马尔可夫模型(转载)

马尔可夫模型是由Andrei A. Markov于1913年提出的 ?? 设 SS是一个由有限个状态组成的集合 S={1,2,3,-,n?1,n}S={1,2,3,-,n?1,n} 随机序列 XX 在 tt时刻所处的状态为 qtqt,其中 qt∈Sqt∈S,若有: P(qt=j|qt?1=i,qt?2=k,?)=P(qt=j|qt?1=i)P(qt=j|qt?1=i,qt?2=k,?)=P(qt=j|qt?1=i) aij≥0∑jnaij=1aij≥0∑jnaij=1 则随机序列 XX构成一个一

隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率

隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法解码隐藏状态序列(TODO) 在隐马尔科夫模型HMM(一)HMM模型中,我们讲到了HMM模型的基础知识和HMM的三个基本问题,本篇我们就关注于HMM第一个基本问题的解决方法,即已知模型和观测序列,求观测序列出现的概率. 1. 回顾HMM问题一:求观测序列的概率 首先我们回顾下HMM模型的问题一.这个

隐马尔可夫模型(七)——隐马尔可夫模型的学习问题(前向后向算法)(转载)

隐马尔可夫模型的学习问题:给定一个输出序列O=O1O2...OT,如何调节模型μ=(A,B,π)的参数,使得P(O|M)最大. 最大似然估计是一种解决方法,如果产生的状态序列为Q=q1q2...qT,根据最大似然估计,可以通过以下公式推算: πi' = δ(q1,si) aij' =  Q中从状态qi转移到qj的次数/Q中从状态qi转移到另一状态(包括qj)的次数 bj(k)' = Q中从状态qj发出符号Vk的次数/ Q中到达状态qj的次数 δ(x,y)为克罗奈克函数,当x=y时,δ(x,y)=

马尔科夫模型与隐马尔科夫模型

随机过程:是随时间而随机变化的过程.又称为随机函数. 马尔科夫模型(VMM):它描述了一类重要的随机过程. 一个系统有有限个状态集S = {s1,s2,sN},随时间推移,该系统将同某一状态转移到另一状态.Q=(s1,s2,,,sN)为一随机变量序列,随机变量取值为状态集S中的一个状态,设时间t时状态为qt. 对系统的描述通常是给出当前时刻t的状态与其前面所有状态的关系:当前时刻 t 处于状态sj的概率取决于其在时间1,2,···,t-1时刻的状态,该概率为 P(qt = sj | qt-1 =

机器学习算法总结(七)——隐马尔科夫模型(前向后向算法、鲍姆-韦尔奇算法、维特比算法)

概率图模型是一类用图来表达变量相关关系的概率模型.它以图为表示工具,最常见的是用一个结点表示一个或一组随机变量,结点之间的变表是变量间的概率相关关系.根据边的性质不同,可以将概率图模型分为两类:一类是使用有向无环图表示变量间的依赖关系,称为有向图模型或贝叶斯网:另一类是使用无向图表示变量间的相关关系,称为无向图模型或马尔科夫网. 隐马尔科夫模型(简称HMM)是结构最简单的动态贝叶斯网,是一种著名的有向图模型,主要用于时间序数据建模,在语音识别,自然语言处理,生物信息,模式识别中有着广泛的应用,虽

隐马尔科夫模型(前向后向算法、鲍姆-韦尔奇算法、维特比算法)

概率图模型是一类用图来表达变量相关关系的概率模型.它以图为表示工具,最常见的是用一个结点表示一个或一组随机变量,结点之间的变表是变量间的概率相关关系.根据边的性质不同,可以将概率图模型分为两类:一类是使用有向无环图表示变量间的依赖关系,称为有向图模型或贝叶斯网:另一类是使用无向图表示变量间的相关关系,称为无向图模型或马尔科夫网. 隐马尔科夫模型(简称HMM)是结构最简单的动态贝叶斯网,是一种著名的有向图模型,主要用于时间序数据建模,在语音识别,自然语言处理,生物信息,模式识别中有着广泛的应用,虽

无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

[Beego模型] 六、事务处理

[Beego模型] 一.ORM 使用方法 [Beego模型] 二.CRUD 操作 [Beego模型] 三.高级查询 [Beego模型] 四.使用SQL语句进行查询 [Beego模型] 五.构造查询 [Beego模型] 六.事务处理 ORM 可以简单的进行事务操作 o := NewOrm() err := o.Begin() // 事务处理过程 ... ... // 此过程中的所有使用 o Ormer 对象的查询都在事务处理范围内 if SomeError { err = o.Rollback()

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: ? ? ? ? ? ?将一些东西封装到一个地方,你还可以取出来 ? ? ? ? ? ?类设置静态属性, 设置一些方法 或者 对象, 对象可以在其对象封装一些属性 多态: ? ? ? ? ? ?python默认支持多态, 多态指的是一种事务具有多种形态 ? ? ? ? ? ?1.多态可以增加代码的灵活度: ? ? ? ? ? ?2.以继承和重写父类方法为前提: ?