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 传统后向算法的更多相关文章

  1. HMM 自学教程(七)前向后向算法

    本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...

  2. HMM 前向后向算法(转)

    最近研究NLP颇感兴趣,但由于比较懒,所以只好找来网上别人的比较好的博客,备份一下,也方便自己以后方便查找(其实,一般是不会再回过头来看的,嘿嘿 -_-!!) 代码自己重新写了一遍,所以就不把原文代码 ...

  3. 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率

    隐马尔科夫模型HMM(一)HMM模型 隐马尔科夫模型HMM(二)前向后向算法评估观察序列概率 隐马尔科夫模型HMM(三)鲍姆-韦尔奇算法求解HMM参数(TODO) 隐马尔科夫模型HMM(四)维特比算法 ...

  4. 隐马尔可夫(HMM)、前/后向算法、Viterbi算法

    HMM的模型  图1 如上图所示,白色那一行描述由一个隐藏的马尔科夫链生成不可观测的状态随机序列,蓝紫色那一行是各个状态生成可观测的随机序列 话说,上面也是个贝叶斯网络,而贝叶斯网络中有这么一种,如下 ...

  5. 条件随机场CRF(二) 前向后向算法评估标记序列概率

    条件随机场CRF(一)从随机场到线性链条件随机场 条件随机场CRF(二) 前向后向算法评估标记序列概率 条件随机场CRF(三) 模型学习与维特比算法解码 在条件随机场CRF(一)中我们总结了CRF的模 ...

  6. HMM-前向后向算法

    基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,...\) \(\lambda(A,B,\pi)\) 状态转移概率 \(A = \{a ...

  7. HMM-前向后向算法(附python实现)

    基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,...\) \(\lambda(A,B,\pi)\) 状态转移概率 \(A = \{a ...

  8. HMM-前向后向算法(附代码)

    目录 基本要素 HMM三大问题 概率计算问题 前向算法 后向算法 前向-后向算法 基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,.. ...

  9. HMM-前向后向算法与实现

    目录 基本要素 HMM三大问题 概率计算问题 前向算法 后向算法 前向-后向算法 基本要素 状态 \(N\)个 状态序列 \(S = s_1,s_2,...\) 观测序列 \(O=O_1,O_2,.. ...

随机推荐

  1. web.py下获取get参数

    比较简单,就直接上代码了: import web urls = ( '/', 'hello' ) app = web.application(urls, globals()) class hello: ...

  2. I/O检测介绍

    I/O性能监测可总结如下:* 任何时间出现CPU等待IO,说明磁盘超载.* 计算出你的磁盘可维持的IOPS值.* 判定你的应用是属于随机磁盘访问型还是有序型.* 通过对比等待时间和服务时间即可判断磁盘 ...

  3. fcitx无法切换到中文(manjaro)

    安装fcitx后不能切换到中文输入法,在.bashrc或者.profile中添加以下代码: #fcitx export GTK_IM_MODULE=fcitx  export QT_IM_MODULE ...

  4. java:常用类(包装类,equals和==的比较,Date,java.lang.String中常用方法,枚举enum)

    *包装类: 将基本类型封装成类,其中包含属性和方法以方便对象操作. *byte---->Byte *short--->Short *long--->Long *float---> ...

  5. Python学习之进程

    8.2 进程 8.2.1 进程的创建 开启多进程scoketserver:server.client 进程的开启:python中的多线程,一定是有一个主进程,由主进程创建几个子进程, Linux与Wi ...

  6. python基础及安装

    一.python介绍 介绍  python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Python这个名 ...

  7. NOIp D1T1 小凯的疑惑

    吐槽 果然让人很疑惑,这道题,对于我这种数学渣渣来说太不友好了,哪里想得到结论,猜也猜不到. 思路一 纯数学,见过的飞快切掉,没见过的就... 结论就是:已知$a,b$为大于$ 1 $的互质的正整数, ...

  8. illustrator 偏方

    视图 边角构件  - - 这个是显示边角弧度的

  9. kafka语句示例

    1.从http://kafka.apache.org/下载kafka安装包:2.tar zxvf kafka_2.8.0.tar.gz,修改配置文件conf/server.properties:bro ...

  10. LayaAir疑难杂症之四:laya引擎自动断点到bundle.js文件中且无报错,但程序不再执行

    在一次断点调试中,突然程序不再按照博主指定的断点执行,莫名其妙端点到了bundle.js文件中的某一行中,这是不应该的,第一次时间反应就是引擎出了问题,但是总不能让博主卸载重装吧. 经过查找资料,询问 ...