typedef struct
{
int N; /* 隐藏状态数目;Q={1,2,…,N} */
int M; /* 观察符号数目; V={1,2,…,M}*/
double **A; /* 状态转移矩阵A[1..N][1..N]. a[i][j] 是从t时刻状态i到t+1时刻状态j的转移概率 */
double **B; /* 混淆矩阵B[1..N][1..M]. b[j][k]在状态j时观察到符合k的概率。*/
double *pi; /* 初始向量pi[1..N],pi[i] 是初始状态概率分布 */
} HMM;前向算法程序示例如下:
/*函数参数说明:*phmm:已知的HMM模型;T:观察符号序列长度;*O:观察序列;**alpha:局部概率;*pprob:最终的观察概率
*/
void Forward(HMM *phmm, int T, int *O, double **alpha, double *pprob)
{int i, j;   /* 状态索引 */int t;    /* 时间索引 */double sum; /*求局部概率时的中间值 *//* 1. 初始化:计算t=1时刻所有状态的局部概率: */for (i = 1; i <= phmm->N; i++)alpha[1][i] = phmm->pi[i]* phmm->B[i][O[1]];/* 2. 归纳:递归计算每个时间点,t=2,… ,T时的局部概率 */for (t = 1; t < T; t++){for (j = 1; j <= phmm->N; j++){sum = 0.0;for (i = 1; i <= phmm->N; i++)sum += alpha[t][i]* (phmm->A[i][j]);alpha[t+1][j] = sum*(phmm->B[j][O[t+1]]);}}/* 3. 终止:观察序列的概率等于T时刻所有局部概率之和*/*pprob = 0.0;for (i = 1; i <= phmm->N; i++)*pprob += alpha[T][i];
}维比特算法:
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]];
}后向算法:
void Backward(HMM *phmm, int T, int *O, double **beta, double *pprob)
{int i, j; /* state indices */int t; /* time index */double sum;/* 1. Initialization */for (i = 1; i <= phmm->N; i++)beta[T][i] = 1.0;/* 2. Induction */for (t = T - 1; t >= 1; t--){for (i = 1; i <= phmm->N; i++){sum = 0.0;for (j = 1; j <= phmm->N; j++)sum += phmm->A[i][j] *(phmm->B[j][O[t+1]])*beta[t+1][j];beta[t][i] = sum;}}/* 3. Termination */*pprob = 0.0;for (i = 1; i <= phmm->N; i++)*pprob += beta[1][i];
}前向后向算法:
void BaumWelch(HMM *phmm, int T, int *O, double **alpha, double **beta, double **gamma, int *pniter, double *plogprobinit, double *plogprobfinal)
{int i, j, k;int t, l = 0;double logprobf, logprobb, threshold;double numeratorA, denominatorA;double numeratorB, denominatorB;double ***xi, *scale;double delta, deltaprev, logprobprev;deltaprev = 10e-70;xi = AllocXi(T, phmm->N);scale = dvector(1, T);ForwardWithScale(phmm, T, O, alpha, scale, &logprobf);*plogprobinit = logprobf; /* log P(O |intial model) */BackwardWithScale(phmm, T, O, beta, scale, &logprobb);ComputeGamma(phmm, T, alpha, beta, gamma);ComputeXi(phmm, T, O, alpha, beta, xi);logprobprev = logprobf;do{/* reestimate frequency of state i in time t=1 */for (i = 1; i <= phmm->N; i++)phmm->pi[i] = .001 + .999*gamma[1][i];/* reestimate transition matrix and symbol prob ineach state */for (i = 1; i <= phmm->N; i++){denominatorA = 0.0;for (t = 1; t <= T - 1; t++)denominatorA += gamma[t][i];for (j = 1; j <= phmm->N; j++){numeratorA = 0.0;for (t = 1; t <= T - 1; t++)numeratorA += xi[t][i][j];phmm->A[i][j] = .001 +.999*numeratorA/denominatorA;}denominatorB = denominatorA + gamma[T][i];for (k = 1; k <= phmm->M; k++){numeratorB = 0.0;for (t = 1; t <= T; t++){if (O[t] == k)numeratorB += gamma[t][i];}phmm->B[i][k] = .001 +.999*numeratorB/denominatorB;}}ForwardWithScale(phmm, T, O, alpha, scale, &logprobf);BackwardWithScale(phmm, T, O, beta, scale, &logprobb);ComputeGamma(phmm, T, alpha, beta, gamma);ComputeXi(phmm, T, O, alpha, beta, xi);/* compute difference between log probability oftwo iterations */delta = logprobf - logprobprev;logprobprev = logprobf;l++;}while (delta > DELTA); /* if log probability does notchange much, exit */*pniter = l;*plogprobfinal = logprobf; /* log P(O|estimated model) */FreeXi(xi, T, phmm->N);free_dvector(scale, 1, T);
}

HMM前向算法,维比特算法,后向算法,前向后向算法代码相关推荐

  1. 隐马尔科夫模型,第三种问题解法,维比特算法(biterbi) algorithm python代码

    上篇介绍了隐马尔科夫模型 本文给出关于问题3解决方法,并给出一个例子的python代码 回顾上文,问题3是什么, 下面给出,维比特算法(biterbi) algorithm 下面通过一个具体例子,来说 ...

  2. 通过深度优先算法来找出有向图的树边,后向边,前向边,横跨边

    **通过深度优先算法来找出有向图的树边,后向边,前向边,横跨边(Java实现) ** package graph;import java.io.IOException; import java.uti ...

  3. 大数据DDos检测——DDos攻击本质上是时间序列数据,t+1时刻的数据特点和t时刻强相关,因此用HMM或者CRF来做检测是必然! 和一个句子的分词算法CRF没有区别!...

    DDos攻击本质上是时间序列数据,t+1时刻的数据特点和t时刻强相关,因此用HMM或者CRF来做检测是必然!--和一个句子的分词算法CRF没有区别! 注:传统DDos检测直接基于IP数据发送流量来识别 ...

  4. SAR成像系列:【3】合成孔径雷达(SAR)的二维回波信号与简单距离多普勒(RD)算法 (附matlab代码)

    合成孔径雷达发射信号以线性调频信号(LFM)为基础,目前大部分合成孔径雷达都是LFM体制,为了减轻雷达重量也采用线性调频连续波(FMCW)体制:为了获得大带宽亦采用线性调频步进频(FMSF)体制. ( ...

  5. KMP算法及next数组(最大公共前后缀)求解

    KMP算法及next数组(最大公共前后缀)求解 2020.12.14理解: 1. KMP算法 网上关于KMP算法讲解较为简单易懂,因此在此只作简述: 在字符串s中匹配字符串t: S: ABE-AB-A ...

  6. 【每日新闻】换脸视频后 AI又出偏门应用:用算法“脱掉”女性衣服

    点击蓝字关注我们更多精彩,请点击上方蓝字关注我们! 每日新闻播报 第06-27期 1 趋势洞察 英特尔杰夫克劳斯:人工智能将在数据中心管理当中扮演重要角色 随着云计算爆发,数据中心的发展近些年来也取得 ...

  7. TF之LSTM:基于tensorflow框架自定义LSTM算法实现股票历史(1990~2015数据集,6112预测后100+单变量最高)行情回归预测

    TF之LSTM:基于tensorflow框架自定义LSTM算法实现股票历史(1990~2015数据集,6112预测后100+单变量最高)行情回归预测 目录 输出结果 LSTM代码 输出结果 数据集 L ...

  8. 求解二维矩形 Packing 问题的一种优美度枚举 算法的个人心得1

    求解二维矩形 Packing 问题的一种优美度枚举 算法的个人心得 个人思考: 10.14: 提出了基于 "角区"的基本算法 什么是角区? 定义4 (角区) 矩形框中由块或者矩形框 ...

  9. 二叉树的后序遍历的非递归实现算法

    算法思想: 后序遍历二叉树的顺序是左右根.我们需要用一个辅助栈来记录没有访问过得祖宗节点. 借助一个简单的二叉树模拟一下过程. 后序遍历的顺序是DEBFGCA 算法步骤 1.沿着根的左孩子,依次入栈, ...

最新文章

  1. PHPTree——快速生成无限多级分类
  2. 直接操作游戏对象C#游戏开发
  3. WPF 使用MahApps.Metro UI库
  4. 注册注解BeanDefinition
  5. redis缓存雪崩和缓存穿透
  6. SELECT的学习以及在socket中的应用
  7. R 语言怎么保存工作目录到当前路径_【R语言基础】01.R语言软件环境搭建及常用操作...
  8. 信息学奥赛C++语言:摘李子
  9. ASP.Net学习笔记013--ViewState初探2
  10. 计算Pearson 相关系数的三种方式
  11. maven库的查询和配置
  12. java实现kotlin接口_Kotlin 接口与 Java8 新特性接口详解
  13. 【机器学习】解释机器学习模型
  14. matlab找最大值,如何在MATLAB中的矩阵列中找到最大值的索引?
  15. 快捷指令 python_有没有硬核的iOS快捷指令推荐(实用性)?
  16. HDUOJ 6806 Equal Sentences
  17. 设计模式-工厂模式(学习)
  18. Aapache 启动不了,报错信息:suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
  19. 在线PNG图片压缩工具推荐——TinyPng
  20. 球差透射电镜测试服务的收费标准和样品要求

热门文章

  1. 联发科技嵌入式_英特尔联手联发科技重回移动5G征途,能否与高通抗衡?
  2. 服务器位置缩写,服务器地区缩写
  3. 像科学家一样思考python 第二版 epub_Kindle Python教程 – 像计算机科学家一样思考python(第2版) epub,mobi...
  4. String(字符串) 比较大小 如果有A+BB+A 则AB
  5. 环形均分纸牌问题(中位数)
  6. ubuntu14.04的键盘失灵解决方案
  7. Spring Boot中使用多数据库
  8. React with Webpack - 3: 内联image、font
  9. 【Detectron2】使用 Detectron2 训练基于 coco 数据集的目标检测网络
  10. 神经网络 梯度下降_梯度下降优化器对神经网络训练的影响