一、隐马尔科夫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

定义几个宏及变量表示HMM:

#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去公园,2去公园,3不去公园,4去公园,5不去公园” 动作序列的概率。

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

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

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

2、填表求解过程:

        //初始表
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;

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

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

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

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

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

bestPath[t][i],表示是第t天,天气状态为i状态出现观察序列O0~Ot的最大概率路径下(即取得maxP[t][i])。第t-1天的天气状态。

2、填表过程:

//初始表
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)
{
maxpp = temp;
maxPre = j;
}
}
maxP[t][i] = maxpp;
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;

四、代码:

#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 viterbi()
{
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)
{
maxpp = temp;
maxPre = j;
}
}
maxP[t][i] = maxpp;
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();
viterbi();
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

最大的概率为:0.00146479

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

2 0 2 0 0

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



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

  1. SQL Server 获取满足条件的每个条件下的前N条数据

    从数据库获取数据时,经常会遇到获取一个数据列表和该列表中每条数据对应的另一个列表的情况,如果二级列表获取的是全部数据,那么就比较简单.如果二级列表获取的是前n条数据,就会比较麻烦. 从操作上来看,好像 ...

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

    隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法 ...

  3. HMM:隐马尔科夫模型-前向算法

    http://blog.csdn.net/pipisorry/article/details/50722376 目标-解决HMM的基本问题之一:已知HMM模型λ及观察序列O,如何计算P(O|λ)(计算 ...

  4. HMM模型学习笔记(前向算法实例)

    HMM算法想必大家已经听说了好多次了,完全看公式一头雾水.但是HMM的基本理论其实很简单.因为HMM是马尔科夫链中的一种,只是它的状态不能直接被观察到,但是可以通过观察向量间接的反映出来,即每一个观察 ...

  5. HMM 自学教程(五)前向算法

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  6. 条件随机场CRF(三) 模型学习与维特比算法解码

    条件随机场CRF(一)从随机场到线性链条件随机场 条件随机场CRF(二) 前向后向算法评估标记序列概率 条件随机场CRF(三) 模型学习与维特比算法解码 在CRF系列的前两篇,我们总结了CRF的模型基 ...

  7. HMM隐马尔科夫算法(Hidden Markov Algorithm)初探

    1. HMM背景 0x1:概率模型 - 用概率分布的方式抽象事物的规律 机器学习最重要的任务,是根据一些已观察到的证据(例如训练样本)来对感兴趣的未知变量(例如类别标记)进行估计和推测. 概率模型(p ...

  8. AliIAC 智能音频编解码器:在有限带宽条件下带来更高质量的音频通话体验

    随着信息技术的发展,人们对实时通信的需求不断增加,并逐渐成为工作生活中不可或缺的一部分.每年海量的音视频通话分钟数对互联网基础设施提出了巨大的挑战.尽管目前全球的互联网用户绝大多数均处于良好的网络状况 ...

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

    为了证实在常规手段破解下能有效保护程序核心功能(演示版本对AES加解密算法及数据库的密钥(一段字符串)进行了保护),特对此DLL保护思路进行相应的测试,包含了反编译及反射测试,看是否能得到AES加解密 ...

随机推荐

  1. 关于微服务、SOA、以及API的理解

    现在微服务.SOA.RESTful API设计等在各大公司很流行.微服务(micro services)这个概念不是新概念,很多公司已经在实践了,例如亚马逊.Google.FaceBook,Aliba ...

  2. Read from socket failed: Connection reset by peer.

    复制密钥另一台主机时,出现了错误: Read from socket failed: Connection reset by peer. 到被登录主机的/var/log/auth.log查看日志: M ...

  3. 〖Network〗宿舍配置两路由器,同时访问校园内网和校园外网

    环境: 校园宿舍, 10.x.x.x 和 172.16.x.x~172.31.x.x是校园内网,本科教务系统什么的都在上边 路由器: 路由器1(校园内网):水星MR807 路由器2(拨号上网):TP ...

  4. LS下怎样最大限度的提高Domino下Web应用的速度

    1.用For 循环代替Do 循环,因为Do循环会反复的计算条件! 2.在数族元素中循环式用Forall代替for.一元数组会快75%,二元会快50%左右. 3.简化If里的条件,如:if a=x an ...

  5. 【原创】kerberos无密码登录

    通常在远程客户端上登录kerbros都需要密码,在学习hadoop的时候提到了ktutil这个工具,这里将使用方法贴出来. 用到的命令如下: 1.ktutil 2.add_entry -passwor ...

  6. MongoDB中的一些坑( 2.4.10 版本)

    http://www.jb51.net/article/62654.htm 1.MongoDB 数据库级锁 MongoDB的锁机制和一般关系数据库如 MySQL(InnoDB), Oracle 有很大 ...

  7. h2database轻量级数据库

    h2和derby一样,都是轻量级数据库,h2比derby还要轻巧,核心jar包不到1M.性能效率等等方面都非常好(前提不是高并发,高数据量) 轻量级数据库的应用出其不意,可以完成很多以前常规开发中无法 ...

  8. node下使用jquery

    node使用jquery的两种方式 在node下,使用jquery有两种方法: 使用jsdom模拟一个window对象 使用cheerio,cheerio只实现了jquery的dom部分功能,相当于j ...

  9. Jetty使用内存过大的解决方案

    之前用Jetty做过一个消息通知服务器,主要功能就是其他各个子系统如果有需要push给客户端消息的就把这个消息发给我的Server,我用WebSocket来推送给客户端~ 程序上线一段时间之后运维工程 ...

  10. 进阶之路(基础篇) - 004 I/O的模拟量输出

    /********************************* 代码功能:某输出模拟量 使用函数: analogWrite(引脚号,模拟量); //调用8位AD 创作时间:2016*10*08 ...