HMM条件下的 前向算法 和 维特比解码

一、隐马尔科夫HMM假设:

有且只有3种天气:0晴天,1阴天,2雨天

各种天气间的隔天转化概率mp:

mp[3][3] 晴天 阴天 雨天
晴天 0.33333 0.33333 0.33333
阴天 0.33333 0.33333 0.33333
雨天 0.33333 0.33333 0.33333

有2种活动:            0去公园,1不去公园

各种天气下进行各种活动的概率:

w2a[3][2] 去公园 不去公园
晴天 0.75 0.25
阴天 0.4 0.6
雨天 0.25 0.75

观察5天的活动序列:0 0 1 0 1 ;(0去公园,1不去公园)

5天的动作观察序列 O[5]
1天 2天 3天 4天 5天
去公园 去公园 不去 去公园 不去
0 0 1 0 1

第0天的天气概率pi:

pi[3] 第0天天气概率
晴天 0.5
阴天 0.3
雨天 0.2

二、前向算法--出现观察动作序列的概率

即求出现:“1去公园,2去公园,3不去公园,4去公园,5不去公园” 动作序列的概率。

这是一个求和问题,用DP思想的前向算法解决。

1、构造矩阵float sumP[T][M];

sumP[t][i]表示:在时间t,处于天气i,且出现观察动作序列O0-Ot的概率

2、填表过程:

for(t=1; t<T; t++)

{

for (i=0; i<M; i++)

{

sumP[t][i]=0;

for (j=0; j<M; j++)

{

sumP[t][i] += sumP[t-1][j]*mp[j][i]*w2a[ i ][ O[t] ];

}

}

}

三、维特比解码-哪种天气下出现观察动作序列的概率最大

在哪种天气序列下,出现观察序列的概率最大,并求 (出现该天气序列和观察动作序列事件)的最大概率。

这是最优化问题,DP思想求最大,采用维特比解码

1、构造矩阵maxP[T][M]

maxP[t][j], 算出第t天处于第i状态且出现观察序列O0~Ot的路径中,(出现天气路径和观察路径)概率最大的路径的概率

2、填表过程:

for(t=1;t<T;t++)    //每一天

{

for(i=0;i<M;i++)//maxP[t][j]

{

maxpp=0;

maxPre=0;

for(j=0;j<M;j++)//第t-1天,天气为第j状态

{

float temp = maxP[t-1][j]*mp[j][i]*w2a[i][O[t]];

if(temp > maxpp)

{

maxP[t][i] = temp;

maxPre     = j;

}

}

bestPath[t][i] = maxPre;

}

}

四、代码:

#include<iostream>

using namespace std;

#define T 5       //观察N天

#define M 3        //每天可能有M种天气

#define N 2        //动作种类,去公园+不去公园

float mp[M][M];    //相邻两天的天气转换概率

float w2a[M][N];   //weather to action,各天气下采取各动作的概率

int O[T];          //N天观察到的天气序列

int bestPath[T][M];//bestPath[t][i]表示 (第t天处于第i种天气状态且出现“O0-Ot”观察序列的概率最大的)路径在时间t-1时刻的天气状态

float pi[M];       //一个M维向量,表示第一天各种天气出现的概率,【通常包含一个1,其余为0】

void initHMM()

{

int i,j,k;

//输入天气转移概率

for(i=0; i<M; i++)

{

for(j=0;j<M;j++)

{

cin>>mp[i][j];

}

}

//输入各天气下,采取不同动作的概率

for(i=0; i<M; i++)

{

for(j=0; j<N; j++)

{

cin>>w2a[i][j];

}

}

//输入pi

for(i=0; i<M; i++)

{

cin>>pi[i];

}

//输入观察序列

for(i=0; i<T; i++)

{

cin>>O[i];

}

}

/*维特比算法

已知HMM模型,转移概率(天气转换概率),初始状态(第0天的天气或天气概率),各天气下采取各动作的概率,观察序列(动作序列)

1.求出(使观察序列出现概率最大的)天气路径,

即在那种天气序列下,出现观察序列的概率最大

2.求出 (出现天气路径且出现观察序列的事件)的最大概率

这是一种最优化问题,求最大,DP思想

*/

float vitebi()

{

float maxP[T][M];

int i,j,t;

//初始表

float maxpp=0;

int   maxPre=0;

for(i=0;i<M;i++)

{

maxP[0][i] = pi[i]*w2a[ i ][ O[0] ];

if(maxP[0][i]>maxpp)

{

bestPath[0][i]=-1;

maxpp=maxP[0][i];

}

}

//后填表

for(t=1;t<T;t++)    //每一天

{

for(i=0;i<M;i++)//maxP[t][j],要算出第t天处于第i状态且出现观察序列O0~Ot的路径中,(出现天气路径和观察路径)概率最大的路径的概率

{

maxpp=0;

maxPre=0;

for(j=0;j<M;j++)//第t-1天,天气为第j状态

{

float temp = maxP[t-1][j]*mp[j][i]*w2a[i][O[t]];

if(temp > maxpp)

{

maxP[t][i] = temp;

maxPre     = j;

}

}

bestPath[t][i] = maxPre;

}

}

float maxEndP=0;

int lastChoice;

for(i=0; i<M; i++)

{

if(maxP[T-1][i] > maxEndP)

{

maxEndP    = maxP[T-1][i];

lastChoice = i;

}

}

cout<<"最大的概率为:"<<maxEndP<<endl;

cout<<"所有路径中,出现观察序列概率的最大的天气路径为:"<<endl;

cout<<lastChoice<<" ";

for(t=T-1; t>0; t--)

{

cout<<bestPath[t][lastChoice]<<" ";

lastChoice = bestPath[t][lastChoice];

}

cout<<endl;

return maxEndP;

}

/*

前向算法

已知HMM模型,转移概率(天气转换概率),初始状态(第0天的天气或天气概率),各天气下采取各动作的概率,观察序列(动作序列)

1.求出观察序列出现的概率为多大

即,在给定的初始天气,转移天气概率,及天气动作概率的条件下,出现观察到的动作概率是多少

这是一个加法求和问题,DP思想

*/

void forward()

{

float sumP[T][M];

//sumP[t][i]表示:在时间t,处于天气i,且出现观察动作序列O0-Ot的概率

int t,i,j,k;

//初始表

for(i=0; i<M; i++)

{

sumP[0][i] = pi[i]*w2a[ i ][ O[0] ];

}

//填表

for(t=1; t<T; t++)

{

for (i=0; i<M; i++)

{

sumP[t][i]=0;

for (j=0; j<M; j++)

{

sumP[t][i] += sumP[t-1][j]*mp[j][i]*w2a[ i ][ O[t] ];

}

}

}

float sumPP=0;

for(i=1;i<M;i++)

{

sumPP += sumP[T-1][i];

}

cout<<"使用前向算法算出,观察序列的出现概率为"<<sumPP<<endl;

}

int main()

{

initHMM();

vitebi();

forward();

system("pause");

}

/*

0.33333 0.33333 0.33333

0.33333 0.33333 0.33333

0.33333 0.33333 0.33333

0.75 0.25

0.4 0.6

0.25 0.75

0.5 0.3 0.2

0 0 1 0 1

*/

五、运行结果:

0.33333 0.33333 0.33333

0.33333 0.33333 0.33333

0.33333 0.33333 0.33333

0.75 0.25

0.4 0.6

0.25 0.75

0.5 0.3 0.2

0 0 1 0 1

最大的概率为:2.17005e-005

所有路径中,出现观察序列概率的最大的天气路径为:

2 2 2 2 2

使用前向算法算出,观察序列的出现概率为0.0284842

请按任意键继续. . .

HMM条件下的 前向算法 和 维特比解码,布布扣,bubuko.com

时间: 2024-11-10 01:12:50

HMM条件下的 前向算法 和 维特比解码的相关文章

HMM的应用与前向、后向、Viterbi算法

在上一篇文章机器学习中的隐马尔科夫模型(HMM)详解中,我们已经向大家介绍了HMM的基本概念.本文将通过几个例子来演示HMM可以帮我们做些什么事情.特别地,在这个过程中,我们还将向你介绍HMM中非常重要的前向(Forward)算法以及(基于动态规划思想设计的)维特比(Viterbi)算法. 一个引子 前向(Forward)算法 维特比(Viterbi)算法 HMM在自然语言处理中的应用举例 欢迎关注白马负金羁的博客 http://blog.csdn.net/baimafujinji,为保证公式.

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

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

HMM:前向算法实例

看本篇文章,假设你已经知道HMM中的前向算法相关概念 如果不知道,推荐先学习HMM学习最佳范例中相关文章 这个问题来自于HMM学习最佳范例五:前向算法5 只不过再手动算一下,加深一下自己的理解 已知隐马尔科夫模型如下: 1.隐藏状态 (天气):Sunny,Cloudy,Rainy: 2.观察状态(海藻湿度):Dry,Dryish,Damp,Soggy: 3.初始状态概率: Sunny(0.63), Cloudy(0.17), Rainy(0.20): 4.状态转移矩阵: 5.混淆矩阵: M=4(

隐马尔可夫模型的前向算法(java实现),今天奉上

隐马尔可夫模型的前向算法(手动实现),今天奉上,由于研究生期间,实现的时候没有多加注释,这里为了让更好的人进入自然语言处理领域,特此,将前向算法奉上,具体公式可参考52nlp的HMN系列博客. 参考了大部分网站公式和借鉴.在此表示感谢. 后向算法和维特比算法,后续更新. HMM类: 1 package jxutcm.edu.cn.hmm.model;  2   3 import jxutcm.edu.cn.hmm.bean.HMMHelper;  4   5 /**  6  * 实现了 HMM(

隐马尔可夫模型中基于比例因子的前向算法(java实现)

直接上干货哈,其他子算法,后续补上. 1 package jxutcm.edu.cn.hmm.model;  2   3 import jxutcm.edu.cn.hmm.bean.HMMHelper;  4 import jxutcm.edu.cn.util.TCMMath;  5   6 /**  7  * [改进后的前向算法]  8  * [带比例因子修正的前向算法 :计算观察序列的概率 ]  9  * [注意] 改进后,就没必要使用后向算法来求观测序列概率了,直接利用中间比例因子scal

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

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

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

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

前向算法的数学意义上的实现

首先是前向算法 前向算法demo文件:fwd_demo.m 1 %% 前向算法的demo 2 %% 验证的例子参见<统计学习方法>p177 3 %% 4 5 % (编码:红1,白2) 6 % 初始概率分布 7 pi=[0.2 0.4 0.4] 8 9 % 概率转移矩阵 10 A=[ 0.5 0.2 0.3; 11 0.3 0.5 0.2; 12 0.2 0.3 0.5] 13 14 % 观察矩阵(发射矩阵) 15 B=[ 0.5 0.5; 16 0.4 0.6; 17 0.7 0.3] 18

.NET DLL 保护措施详解(五)常规条件下的破解

为了证实在常规手段破解下能有效保护程序核心功能(演示版本对AES加解密算法及数据库的密钥(一段字符串)进行了保护),特对此DLL保护思路进行相应的测试,包含了反编译及反射测试,看是否能得到AES加解密算法的密钥及数据库字符串. 反编译: 我这里使用了.net dll反编译工具ILSpy,以下为真实截图. 1. NetProtect.BLLDemo.dll 2. NetProtect.ConsoleApplication1.exe 3. NetProtect.CoreClr.dll 综合上图,可以