HMM学习三:维特比算法(预测问题)

1. 前言

关于HMM的相关知识请关注之前博文:

HMM学习一:前向和后向算法

HMM学习二:Baum-Welch算法详解(学习算法)

维特比算法针对HMM第三个问题,即解码或者预测问题,寻找最可能的隐藏状态序列:

对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列,找到生成此序列最可能的隐藏状态序列。

也就是说给定了HMM的模型参数和一个观测序列,计算一系列的隐状态,使得此观察序列的出现可能最大,即最大化P(隐状态 | 观测序列),给定观测序列,求最可能的对应的隐状态序列。

实际上解决此问题,在《统计学习方法》中给出了两种解法,一个是近似算法,另一个就是维特比算法(Viterbi algorithm),现在我们专门介绍下维特比算法.

利用动态规划求解概率最大的路径,一条路径一个状态序列。

动态规划求解最优路径专责:如果最优路径在某时刻t 通过节点i,那么这条路径从节点 i 到终点的部分路径,在节点 i 到终点的路径中,必须是最优的。

通过这种原理就可以从t=1时刻开始,不断向后递推到下一个状态的路径的最大概率,直到在最后到达最终的最优路径终点,然后依据终点回溯到起始点,这样就能得到最优路径。

输入:模型参数λ和观测序列

输出:

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是维算法的C语言实现: ``` #include <stdio.h> #include <stdlib.h> #define N 3 // 状态数 #define M 4 // 观测符号数 int main() { int i, j, t; int obs_seq[] = {0, 1, 2, 0}; // 观测序列 double a[N][N] = {{0.5, 0.2, 0.3}, {0.3, 0.5, 0.2}, {0.2, 0.3, 0.5}}; // 转移概率矩阵 double b[N][M] = {{0.5, 0.5, 0.0, 0.0}, {0.0, 0.5, 0.5, 0.0}, {0.0, 0.0, 0.5, 0.5}}; // 发射概率矩阵 double pi[N] = {0.2, 0.4, 0.4}; // 初始状态概率 double delta[M][N]; // delta矩阵 int psi[M][N]; // psi矩阵 int q[M]; // 最优状态序列 // 初始化 for (i = 0; i < N; i++) { delta[0][i] = pi[i] * b[i][obs_seq[0]]; psi[0][i] = 0; } // 递推 for (t = 1; t < M; t++) { for (j = 0; j < N; j++) { double max_delta = 0.0; int max_i = 0; for (i = 0; i < N; i++) { double tmp_delta = delta[t - 1][i] * a[i][j] * b[j][obs_seq[t]]; if (tmp_delta > max_delta) { max_delta = tmp_delta; max_i = i; } } delta[t][j] = max_delta; psi[t][j] = max_i; } } // 终止 double max_delta = 0.0; int max_i = 0; for (i = 0; i < N; i++) { if (delta[M - 1][i] > max_delta) { max_delta = delta[M - 1][i]; max_i = i; } } // 回溯 q[M - 1] = max_i; for (t = M - 2; t >= 0; t--) { q[t] = psi[t + 1][q[t + 1]]; } // 输出结果 printf("最优状态序列为:"); for (t = 0; t < M; t++) { printf("%d ", q[t]); } printf("\n"); return 0; } ``` 其中,`a`数组为转移概率矩阵,`b`数组为发射概率矩阵,`pi`数组为初始状态概率,`obs_seq`数组为观测序列。程序中使用了`delta`和`psi`两个矩阵来辅助计算。最终,程序输出最优状态序列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值