隐马尔科夫模型及Viterbi算法的应用

作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4335810.html

一个例子:

韦小宝使用骰子进行游戏,他有两种骰子一种正常的骰子,还有一种不均匀的骰子,来进行出千。

开始游戏时他有2/5的概率出千。

对于正常的骰子A,每个点出现的概率都是1/6.

对于不均匀的骰子B,5,6两种出现的概率为3/10,其余为1/10.

出千的随机规律如下图所示:

我们观测到的投掷结果为:ob={1,3,4,5,5,6,6,3,2,6}

请判断韦小宝什么时候出千了?

我们可以这样建模$x_i$表示第$i$次投掷的骰子的种类,$y_i$表示第$i$次投掷出的点数,$\lambda$表示各个概率参数。

那么第$t$次使用第$i$种骰子投掷的概率$\delta_t(i)$等于

\begin{equation} \delta_t(i)=\max_{x_1,\dots,x_{t-1}}P(x_1,\dots,x_{t-1},x_t=i,y_1,\dots,y_t|\lambda) \end{equation}

其实$\delta_{t+1}(i)$可以由$\delta_t(i)$推倒得出:

\begin{eqnarray} \delta_{t+1}(i) &=& \max_{x_1,\dots,x_{t}}P(x_1,\dots,x_{t},x_{t+1}=i,y_1,\dots,y_{t+1}|\lambda)\\ &=& \max_j \delta_t(j)\alpha_{ji}\beta_i(y_{t+1})\end{eqnarray}

其中$\alpha_{ji}$表示从第$j$个骰子转移到第$i$个骰子的概率。

$\beta_i(y_{t+1})$表示使用第i个骰子投出点$y_{t+1}$的概率。

从而可以使用上述利用动态规划算法进行逐次递推计算。

得到的结果为:

t $y_t$ $\delta_t(A)$ $\Psi_t(A)$ $\delta_t(B)$ $\Psi_t(B)$
1 1 0.1 A 0.04 A
2 3 0.0133333 A 0.0036 B
3 4 0.00177778 A 0.000324 B
4 5 0.000237037 A 0.000106667 A
5 5 3.16049e-05 A 2.88e-05 B
6 6 4.21399e-06 A 7.776e-06 B
7 6 5.61866e-07 A 2.09952e-06 B
8 3 7.49154e-08 A 1.88957e-07 B
9 2 9.98872e-09 A 1.70061e-08 B
10 6 1.33183e-09 A 4.59165e-09 B

从而从$\Psi_t(A)$和$\Psi_t(B)$中选择$\delta_t()$较大的骰子,从而预测骰子种类序列为:AAAAABBBBB

代码如下所示:

 1 #include <stdlib.h>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <string>
 5 #include <iostream>
 6 using namespace std;
 7 double initP[2] = {0.6, 0.4};//骰子A,B的初始概率
 8 double transferMatrix[2][2] = {{0.8, 0.2}, {0.1, 0.9}};//骰子之间的转移概率
 9 double EmissionP[2][6]={{1/6.0, 1/6.0, 1/6.0, 1/6.0, 1/6.0, 1/6.0},//骰子A的发射概率
10                         {0.1, 0.1, 0.1, 0.1, 0.3, 0.3}};//骰子B的发射概率
11 double dp[10][2];//dp[i][j]第i步时,使用第j个骰子的最大概率
12 double dpS[10][2];//dpS[i][j]第i步时,使用第j个骰子,得到的最大概率时,使用的骰子种类, 0->A, 1->B
13 int ob[10] = {1, 3, 4, 5, 5, 6, 6, 3, 2, 6};//观测点数
14 bool diceArray[10];//预测骰子使用序列
15 void Viterbi()
16 {
17     memset(dp,0,sizeof(dp));
18     memset(dpS,0,sizeof(dpS));
19     memset(diceArray,0,sizeof(diceArray));
20     dp[0][0] = initP[0]* EmissionP[0][ob[0]-1];
21     dp[0][1] = initP[1]* EmissionP[1][ob[0]-1];
22     for( int i = 1 ; i < 10 ; i++ )//投掷次数
23     {
24         for( int j = 0 ; j < 2 ; j++ )//当前状态
25         {
26             for( int k = 0 ; k < 2 ; k++ )//上一个状态
27             {
28                 double tempP = dp[i-1][k] * transferMatrix[k][j] * EmissionP[j][ob[i]-1] ;
29                 if( dp[i][j] < tempP )
30                 {
31                     dp[i][j] = tempP;
32                     dpS[i][j] = k;
33                 }
34             }
35         }
36         if( dp[i][0] < dp[i][1] )
37         {
38             diceArray[i] = dpS[i][1];
39         }
40         else
41         {
42             diceArray[i] = dpS[i][0];
43         }
44     }
45 }
46 int main(int argc, char *argv[])
47 {
48     Viterbi();
49     cout<<"每步每个状态下的概率和骰子种类:"<<endl;
50     for( int i = 0 ; i < 10 ; i++ )
51     {
52         for( int j = 0 ; j < 2 ; j++ )
53         {
54             cout<<dp[i][j]<<" "<<dpS[i][j]<<"    ";
55         }
56         cout<<endl;
57     }
58     cout<<"预测骰子种类,0->A, 1->B : "<<endl;
59     for( int i = 0 ; i < 10 ; i++ )
60     {
61         cout<<diceArray[i]<<" ";
62     }
63     cout<<endl;
64 }

时间: 2024-08-06 15:59:52

隐马尔科夫模型及Viterbi算法的应用的相关文章

七月算法-12月机器学习在线班--第十七次课笔记-隐马尔科夫模型HMM

七月算法-12月机器学习--第十七次课笔记-隐马尔科夫模型HMM 七月算法(julyedu.com)12月机器学习在线班学习笔记http://www.julyedu.com 隐马尔科夫模型 三个部分:概率计算,参数估计,模型预测 1,HMM定义 HMM由初始概率分布π.状态转移概率分布A以及观测概率分布B确定. Eg:以中文分词为例子 隐状态为="2",是不是终止字,是/否?(Y/N)即是不是最后一个字. A矩阵:第一个:当前是终止字,下一个也是终止字的概率 B是当前的隐状态是终止词,

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

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

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

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

【ML-13-4】隐马尔科夫模型HMM--预测问题Viterbi(维特比)算法

[ML-13-1]隐马尔科夫模型HMM [ML-13-2]隐马尔科夫模型HMM--前向后向算法 [ML-13-3]隐马尔科夫模型HMM--Baum-Welch(鲍姆-韦尔奇) [ML-13-4]隐马尔科夫模型HMM--预测问题Viterbi(维特比)算法 目录 基础--HMM常用概率的计算 HMM最可能隐藏状态序列近似算法 Viterbi(维特比)算法 Viterbi(维特比)算法举例 HMM模型最后一个问题的求解:求给定观测序列条件下,最可能出现的对应的隐藏状态序列.即给定模型λ=(A,B,π

隐马尔科夫模型

特征向量:跟踪框位置相对轨迹中心的比值,角度,速度. 马尔科夫模型: State Sequence, q1 q2 ...... qT t个状态之间的转移可见,则这个时间序列的概率是πq1 × aq1q2 × ...... × aqT-1qT 隐马尔科夫模型: 状态不可见(隐藏),只能从观察值推测出,所以由观察值推测该时刻的状态有个观察值概率b. πq1 × bq1( o1 ) × aq1q2 × bq2( o2 ) × ...... × aqT-1qT × bqT( oT ), 三个问题: 1.

HMM基本原理及其实现(隐马尔科夫模型)

HMM(隐马尔科夫模型)基本原理及其实现 HMM基本原理 Markov链:如果一个过程的“将来”仅依赖“现在”而不依赖“过去”,则此过程具有马尔可夫性,或称此过程为马尔可夫过程.马尔可夫链是时间和状态参数都离散的马尔可夫过程.HMM是在Markov链的基础上发展起来的,由于实际问题比Markov链模型所描述的更为复杂,观察到的时间并不是与状态一一对应的,而是通过一组概率分布相联系,这样的模型称为HMM.HMM是双重随机过程:其中之一是Markov链,这是基本随机过程,它描述状态的转移,是隐含的.

炎热天气看书还是钓鱼?隐马尔科夫模型教你预测!

高温天气与行为概率 夏季是一年最热的时候,气温普遍偏高,一般把日最高气温达到35℃以上的天气叫作高温天气,但是一般情况下高温天气分为两类.  (1)干热型高温.一般是指气温较高.太阳辐射强而且空气的湿度较小的高温天气.  (2)闷热型高温.一般是指水汽丰富,但是气温相对而言并不算太高,给人感受闷热.  小张在不同类型下的高温天气下会有不同的行为,但是归纳起来为主要为散步.垂钓.看书三类,分别在干热型高温和闷热型高温下对应行为的概率见下表.  假设干热型高温和闷热型高温之间会进行相互转变,每天可能

隐马尔科夫模型HMM

隐马尔科夫模型HMM 作者:樱花猪 摘要: 本文为七月算法(julyedu.com)12月机器学习第十七次课在线笔记.隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔科夫过程.其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析.在早些年HMM模型被非常广泛的应用,而现在随着机器学习的发展HMM模型的应用场景越来越小然而在图像识别等领域HMM依然起着重要的作用. 引言: 隐马尔科夫模型是马尔科夫链的一种,它

隐马尔科夫模型python实现简单拼音输入法

在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现中文拼音输入的博客,无奈大神没给可以运行的代码,只能纯手动网上找到了结巴分词的词库,根据此训练得出隐马尔科夫模型,用维特比算法实现了一个简单的拼音输入法.githuh地址:https://github.com/LiuRoy/Pinyin_Demo 原理简介 隐马尔科夫模型 抄一段网上的定义: 隐马尔可夫模型 (Hidden Markov Model) 是一种统计模型,用来描述一个含有隐含