隐马尔科夫学习六(五)
来源:互联网 发布:淘宝店铺卖家信用等级 编辑:程序博客网 时间:2024/04/28 15:06
出处:http://www.52nlp.cn/hmm-learn-best-practices-six-viterbi-algorithm-5
六、维特比算法(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”就是最终所找到的隐藏状态序列。好了,维特比算法这一章就到此为止了。
- 隐马尔科夫学习六(五)
- 隐马尔科夫学习五(五)
- Android学习笔记(五六):位置Location
- Pro Android学习笔记(五六):配置变化
- 《第一行代码》学习笔记--Android入门(五、六)
- Liunx学习 五、六单元练习题
- C++笔记(五、六)
- 隐马尔科夫学习六(一)
- 隐马尔科夫学习六(二)
- 隐马尔科夫学习六(三)
- 隐马尔科夫学习六(四)
- cgroup学习(五)——create new cgroup && (六)——attach task
- Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限
- 我学习Object-C中的收获总结(五)(六)
- Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限
- Java for Web学习笔记(五六):Spring框架简介(5)自动识别
- RabbitMQ五种消息队列学习(六)--通配符模式(路由类型:Topic)
- SCARA——OpenGL入门学习五六(三维变换、动画)
- Linux命令工具 top详解
- 抱怨一发
- java 工具栏
- Word文档生成
- win7 JAVA Jdk安装与配置
- 隐马尔科夫学习六(五)
- chrome中密码控件无法加载
- M - Exponentiation
- 《SICP》中的一些练习题
- java内存
- android editText inputType 各个字段的含义
- CATALINA_BASE与CATALINA_HOME的区别
- TableLayout布局表格列按比例切分屏幕
- 基于opencv的Gabor特征提取