HMM 传统后向算法
HMM 传统后向算法,已实现,仅供参考。
package jxutcm.edu.cn.hmm.model;
import jxutcm.edu.cn.hmm.bean.HMMHelper;
import jxutcm.edu.cn.util.TCMMath;
/**
* 后向算法
* 目的:
* 1、先计算后向变量矩阵
* 2、再用后向变量矩阵 来 计算一个观测序列的概率
* @author aool
*/
public class Backward extends HMM{
public int[] O;//观测序列observe//如yellow red blue yellow green 这些在enum Color {red,yellow,blue,green }的索引位置
public double[][] beta; //后向变量矩阵
/**
* flag 表示 A和B是否是自然对数化(lnX) true: A和B自然对数化后传进来 false: A和B未自然对数化
*/
public Backward(double[][] A, double[][] B, double[] PI, int[] O, boolean flag) {
super(A, B, PI, flag);
this.O=O;
}
public Backward(HMM hmm, int[] O){
super(hmm);
this.O=O;
}
/**
* 【计算后向变量矩阵】
* 在时间t、位于隐藏状态为s_i(第i个隐藏状态,共N种隐藏状态)的条件下,hmm输出观察序列O(t+1)...O(T)的概率
* beta[ t ][ i ] = beta_t( i ) = log(P(O(t+1)...O(T) | q_t=s_i, λ))
*/
public void CalculateBackMatrix(){
int T = O.length;
beta = new double[ T ][ N ];//每一时刻(每行)上 可能出现的多个状态的发生的后向变量概率
//1、初始化——将T时刻、第i种隐藏状态输出观察序列的后向变量设置为1即log(1)=0
for (int i = 0; i < N; i++){
beta[ T-1 ][ i ] = 0; // = log(1) // should be hmm.logA[k][0]
}
//2、归纳计算——b_t(i)
for (int t = T - 1 - 1; t >= 0; t--){//第 t 时刻下,从T-2开始向前算——下标从0开始——T-1表示最终时刻
for (int i = 0; i < N; i++) {//第 i 种隐状态下
double sum = Double.NEGATIVE_INFINITY; // = log(0)
for (int j = 0; j < N; j++){//到第 j 种隐状态下的累计概率——b[t][i] = b_t(i) =∑Aij * Bj(O_t+1) *b_t+1( j ) 其中b_t+1( j ) =b[t+1][j],求和符号上面是N,下面是j=1开始
// sum + = A[ i ][ j ] * B[ j ][ O(t+1) ] * beta[ t+1 ][ j ]
sum = TCMMath.logplus( sum, logA[ i ][ j ] + logB[ j ][ O[ t+1 ] ] + beta[t + 1][ j ]);
}
//beta[ t ][ i ] = 【t 时刻 所有 隐藏状态 i】到达 【t+1时刻 隐藏状态 j】并【t+1时刻显示出O( t+1 )】的后向变量概率
//beta[ t ][ i ] = ∑ ( A[ i ][ j ] * B[ j ][ O(t+1) ] * beta[ t+1 ][ j ] ) 求和符号表示 1<=j <=N
beta[ t ][ i ] = sum;//在 【t 时刻、第 i 种隐藏状态】 下 输出观察序列 Ot+1……OT(已知观测序列的局部) 发生的概率
}
}
}
/**
* 【计算一个观测序列的概率】——前提是先计算后向变量矩阵——返回的是自然对数
* P( O | μ ) = ∑ PI_i*B_i*beta_1( i ) (求和上界N,求和下界i=1)——求所有隐藏状态在t=1时刻的累计和就是 观测序列的概率
* 计算 t=0 时刻、位于第 0 状态下的 输出观察序列 O0……OT(已经观测序列的局部)发生的概率
*/
public double logProb() {
double sum = Double.NEGATIVE_INFINITY; // = log(0)
for (int i = 0; i < N; i++){
sum = TCMMath.logplus( sum, logPI[ i ] + logB[ i ][ O[0] ] + beta[ 0 ][ i ]);
}
return sum;
}
/**
* 打印后向变量矩阵
*/
public void print() {
for (int j = 0; j < N; j++) {
for (int i = 0; i < beta.length; i++){
System.out.print(HMMHelper.fmtlog( beta[ i ][ j ]) );
}
System.out.println();
}
}
}
HMM 传统后向算法的更多相关文章
- HMM 自学教程(七)前向后向算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- HMM 前向后向算法(转)
最近研究NLP颇感兴趣,但由于比较懒,所以只好找来网上别人的比较好的博客,备份一下,也方便自己以后方便查找(其实,一般是不会再回过头来看的,嘿嘿 -_-!!) 代码自己重新写了一遍,所以就不把原文代码 ...
- 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率
隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法 ...
- 隐马尔可夫(HMM)、前/后向算法、Viterbi算法
HMM的模型 图1 如上图所示,白色那一行描述由一个隐藏的马尔科夫链生成不可观测的状态随机序列,蓝紫色那一行是各个状态生成可观测的随机序列 话说,上面也是个贝叶斯网络,而贝叶斯网络中有这么一种,如下 ...
- 条件随机场CRF(二) 前向后向算法评估标记序列概率
条件随机场CRF(一)从随机场到线性链条件随机场 条件随机场CRF(二) 前向后向算法评估标记序列概率 条件随机场CRF(三) 模型学习与维特比算法解码 在条件随机场CRF(一)中我们总结了CRF的模 ...
- HMM-前向后向算法
基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,...\) \(\lambda(A,B,\pi)\) 状态转移概率 \(A = \{a ...
- HMM-前向后向算法(附python实现)
基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,...\) \(\lambda(A,B,\pi)\) 状态转移概率 \(A = \{a ...
- HMM-前向后向算法(附代码)
目录 基本要素 HMM三大问题 概率计算问题 前向算法 后向算法 前向-后向算法 基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,.. ...
- HMM-前向后向算法与实现
目录 基本要素 HMM三大问题 概率计算问题 前向算法 后向算法 前向-后向算法 基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,.. ...
随机推荐
- electron--Tray添加图标和上下文菜单到系统通知区(系统托盘)
const { app, Menu, Tray } = require('electron'); //系统托盘图标目录 appTray = new Tray(path.join(__dirname, ...
- SVN 清理失败解决方案
SVN有时因各种不明原因导致清理失败,可以采取如下解决办法进行处理: 方法一: 删除根目录下隐藏文件夹“.svn” 然后在根目录文件夹 外面的空白处 检出.比如你项目文件夹名为“D:/source” ...
- Upload 上传
通过点击或者拖拽上传文件 点击上传 通过 slot 你可以传入自定义的上传按钮类型和文字提示.可通过设置limit和on-exceed来限制上传文件的个数和定义超出限制时的行为.可通过设置before ...
- linux如何杀掉进程(kill)
方法/步骤1: 使用“ps -e|grep mysql”命令,查看mysql程序的对应的pid号.结果如下图: 方法/步骤2: 使用“kill -9 2891”命令,可以结束掉mysqld_saf ...
- apache域名跳转
状态码:*301: 永久重定向,域名跳转一定要用301,对搜索引擎友好的. 302:临时重定向在虚拟主机配置文件/usr/local/apache2/conf/extra/httpd-vhosts & ...
- Android SmartRefreshLayout 使用
SmartRefreshLayout是一款实现上拉加载.下拉刷新的控件,网络上相关内容也很多,在这里简单总结下我的使用 使用SmartRefreshLayout需导入依赖:implementation ...
- 页面访问过程及get/post的理解——
Chrome查看开发者工具面板,常看的一些数据? Elements:查找网页源代码HTML中的任一元素,手动修改任一元素的属性和样式且能实时在浏览器里面得到反馈. Console:记录开发者开发过程中 ...
- Python的组合模式与责任链模式编程示例
Python的组合模式与责任链模式编程示例 这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下 组合模式 我们把Com ...
- ping一个网段下的所有ip
for /l %i in (1,1,255) do ping -n 1 -w 60 192.168.0.%i | find "Reply" >>d:\pingall.l ...
- zabbix报警后不会自动消除解决
http://www.cnblogs.com/zhongkai-27/p/9984597.html