隐马尔可夫模型中基于比例因子的前向算法(java实现)

直接上干货哈,其他子算法,后续补上。

1 package jxutcm.edu.cn.hmm.model;
  2 
  3 import jxutcm.edu.cn.hmm.bean.HMMHelper;
  4 import jxutcm.edu.cn.util.TCMMath;
  5 
  6 /**
  7  * 【改进后的前向算法】
  8  * 【带比例因子修正的前向算法 :计算观察序列的概率 】
  9  * 【注意】 改进后,就没必要使用后向算法来求观测序列概率了,直接利用中间比例因子scale就可以求得,在改进的前向算法中以写logProb()函数
 10  * 
 11  * 前向算法:
 12  * 目的:
 13  * 1、先计算前向变量矩阵
 14  * 2、再用前向变量矩阵 来 计算一个观测序列的概率
 15  * @author haozl
 16  */
 17 public class ForwardWithScale extends HMM{
 18     public int[] O;//观测序列observe//如yellow red blue yellow green 这些在enum Color {red,yellow,blue,green }的索引位置
 19 
 20     public double[][] alpha; //前向变量矩阵
 21     
 22     public double[] scale;//用于修正的比例因子——从带比例因子修正后的前向算法计算
 23     
 24     /**
 25      * flag 表示 A和B是否是自然对数化(lnX)  true: A和B自然对数化后传进来  false: A和B未自然对数化
 26      */
 27     public ForwardWithScale(double[][] A, double[][] B, double[] PI, int[] O, boolean flag){
 28         super(A, B, PI, flag);
 29         this.O=O;
 30     }
 31     
 32     public ForwardWithScale(HMM hmm, int[] O){
 33         super(hmm);
 34         this.O=O;
 35     }
 36     
 37     /**
 38      * 【计算前向变量矩阵】
 39      * 在时间 t 的条件下,hmm输出观察序列O(1)O(2)...O(t)且该时间t下的隐藏状态为s_i(第i个隐藏状态,共N种隐藏状态)的概率
 40      * alpha[ t ][ i ] = alpha_t( i ) = log(P(O(1)O(2)...O(t), q_t=s_i | λ))
 41      */
 42     public void CalculateForeMatrix(){
 43         int T = O.length;
 44         alpha = new double[ T ][ N ];//每一时刻(每行)上 可能出现的多个状态的发生的前向变量概率
 45         scale = new double[ T ];//【比例因子】
 46         scale[ 0 ] =Double.NEGATIVE_INFINITY;
 47         //1、初始化,计算初始时刻(直觉上的第1时刻)所有状态的局部概率
 48         for (int i = 0; i < N ; i++){
 49             alpha[ 0 ][ i ] = logPI[ i ] + logB[ i ][ O[ 0 ] ];
 50             /*******************增加部分*****************/
 51             scale[ 0 ] =  TCMMath.logplus( scale[ 0 ] , alpha[ 0 ][ i ]);
 52         }
 53         /*******************增加部分*****************/
 54         for(int i=0; i< N; i++){//利用比例因子归一化
 55             alpha[ 0 ][ i ] -= scale [ 0 ];
 56         }
 57         
 58         //2、归纳,递归计算每个时间点的局部概率
 59         for (int t = 1; t < T; t++){//从(直觉上的第2时刻)即t=1(下标从0开始)观测值算起——第时间t下开始循环
 60             scale[ t ] = Double.NEGATIVE_INFINITY;
 61             for (int j = 0; j < N; j++) {//
 62                 double sum = Double.NEGATIVE_INFINITY; // = log(0)
 63                 for (int i = 0; i < N; i++){//到第 i 种隐状态下的累计概率
 64                     //sum+=alpha[ t-1 ][ i ] * A[ i ] [ j ] 
 65                     sum = TCMMath.logplus( sum, alpha[t - 1][ i ] + logA[ i ][ j ]);
 66                 }
 67                 //alpha[ t ][ j ] = 【t-1时刻 所有 隐藏状态 i 】到达 【t时刻 隐藏状态 j】并【t时刻显示出O( t )】的前向变量概率
 68                 //alpha[ t ] [ j ] = ∑ ( alpha[ t-1 ][ i ] * A[ i ] [ j ] ) *B[ j ] [ O(t) ]  求和符号表示 1<=i <=N
 69                 alpha[ t ][ j ] = logB[ j ][ O[ t ] ] + sum;//在 【t 时刻】 下 输出观察序列 O1O2……Ot(已知观测序列的局部) 且位于第 j 种隐藏状态发生的概率
 70                 /*******************增加部分*****************/
 71                 scale[ t ] =  TCMMath.logplus( scale[ t ] , alpha[ t ][ j ]);//比例因子
 72             }
 73             /*******************增加部分*****************/
 74             for (int j = 0; j < N; j++) {//利用比例因子归一化
 75                 alpha[ t ][ j ] -= scale [ t ];
 76             }
 77         }
 78     }
 79     
 80     /**
 81      * 【计算观测序列的概率】——返回的是自然对数
 82      */
 83     public double logProb() {
 84         //3、终止,求概率就直接使用比例因子求得
 85         int T = O.length;
 86         double sum = 0; // = log(1)
 87         for(int t=0; t< T; t++){
 88             sum +=  scale[ t ];
 89         }
 90         return sum;
 91     }
 92     
 93     /**
 94      * 【计算观测序列的概率】——前提是先计算前向变量矩阵
 95      * P( O | μ ) = ∑alpha_T( i ) (求和上界N,求和下界i=1)
 96      * @return 返回的结果是概率的自然对数
 97      * 计算 t=T 时刻下输出观察序列 O0……OT(已经观测序列的局部)且位于第 T 状态下发生的概率
 98     public double logProb() {
 99         //3.终止,观察序列的概率等于最终时刻( T )所有局部概率之和
100         double sum = Double.NEGATIVE_INFINITY; // = log(0)
101         int T = O.length;
102         for (int i = 0; i < N; i++){
103             sum = TCMMath.logplus(sum, alpha[ T-1 ][ i ]);//下标从0开始
104         }
105         return sum;
106     }
107     */
108     
109     /**
110      * 打印前向变量矩阵
111      */
112     public void print() {
113         for (int j = 0; j < N; j++) {
114             for (int i = 0; i < alpha.length; i++){
115                 System.out.print(HMMHelper.fmtlog(alpha[ i ][ j ]));
116             }
117             System.out.println();
118         }
119     }

120 }

时间: 2024-10-14 14:15:42

隐马尔可夫模型中基于比例因子的前向算法(java实现)的相关文章

维特比算法在隐马尔可夫模型中的应用

前言 文章标题的两个概念也许对于许多同学们来说都相对比较陌生,都比较偏向于于理论方面的知识,但是这个算法非常的强大,在很多方面都会存在他的影子.2个概念,1个维特比算法,1个隐马尔可夫模型.你很难想象,输入法的设计也会用到其中的一些知识. HMM-隐马尔可夫模型 隐马尔可夫模型如果真的要展开来讲,那短短的一篇文章当然无法阐述的清,所以我会以最简单的方式解释.隐马尔可夫模型简称HMM,根据百度百科中的描述,隐马尔可夫模型描述的是一个含有隐含未知参数的马尔可夫模型.模型的本质是从观察的参数中获取隐含

炎热天气看书还是钓鱼?隐马尔科夫模型教你预测!

高温天气与行为概率 夏季是一年最热的时候,气温普遍偏高,一般把日最高气温达到35℃以上的天气叫作高温天气,但是一般情况下高温天气分为两类.  (1)干热型高温.一般是指气温较高.太阳辐射强而且空气的湿度较小的高温天气.  (2)闷热型高温.一般是指水汽丰富,但是气温相对而言并不算太高,给人感受闷热.  小张在不同类型下的高温天气下会有不同的行为,但是归纳起来为主要为散步.垂钓.看书三类,分别在干热型高温和闷热型高温下对应行为的概率见下表.  假设干热型高温和闷热型高温之间会进行相互转变,每天可能

隐马尔科夫模型的来龙去脉

作为应用广泛的一种统计模型(尤其是在自然语言处理(NLP)中),隐马尔科夫模型是非常值得一说的,本文就隐马尔科夫模型的原理和应用介绍进行说明.由于隐马尔科夫模型有着很多不同的具体算法实现,本文暂时跳过这部分内容,算法部分会另外写成一篇博文. 马尔科夫链 在语言模型及其实现中,我曾经简单地提到过马尔科夫链,这里将会全面详细的说明. 其实马尔科夫链是一种离散的随即过程,可以将其看成是一种有限自动机,但是其状态之间的转移并不是依赖于外界的输入,而是依赖于每个状态之间的转移概率. 如下图所示: 上图中每

统计学习方法 李航---第10章 隐马尔可夫模型

第10章隐马尔可夫模型 隐马尔可夫模型(hidden Markov model, HMM)是可用于标注问题的统计学习模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型. 10.1 隐马尔可夫模型的基本概念 定义10.1 (隐马尔可夫模型) 隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程.隐藏的马尔可夫链随机生成的状态的序列,称为状态序列(state sequence):每个状态生成一个观

HMM隐马尔科夫模型

马尔科夫过程 在概率论及统计学中,马尔可夫过程(英语:Markov process)是一个具备了马尔可夫性质的随机过程,因为俄国数学家安德雷·马尔可夫得名.马尔可夫过程是不具备记忆特质的(memorylessness).换言之,马尔可夫过程的条件概率仅仅与系统的当前状态相关,而与它的过去历史或未来状态,都是独立.不相关的. 一个马尔科夫过程是状态间的转移仅依赖于前n个状态的过程.这个过程被称之为n阶马尔科夫模型,其中n是影响下一个状态选择的(前)n个状态.最简单的马尔科夫过程是一阶模型,它的状态

机器学习算法总结(七)——隐马尔科夫模型(前向后向算法、鲍姆-韦尔奇算法、维特比算法)

概率图模型是一类用图来表达变量相关关系的概率模型.它以图为表示工具,最常见的是用一个结点表示一个或一组随机变量,结点之间的变表是变量间的概率相关关系.根据边的性质不同,可以将概率图模型分为两类:一类是使用有向无环图表示变量间的依赖关系,称为有向图模型或贝叶斯网:另一类是使用无向图表示变量间的相关关系,称为无向图模型或马尔科夫网. 隐马尔科夫模型(简称HMM)是结构最简单的动态贝叶斯网,是一种著名的有向图模型,主要用于时间序数据建模,在语音识别,自然语言处理,生物信息,模式识别中有着广泛的应用,虽

隐马尔科夫模型(前向后向算法、鲍姆-韦尔奇算法、维特比算法)

概率图模型是一类用图来表达变量相关关系的概率模型.它以图为表示工具,最常见的是用一个结点表示一个或一组随机变量,结点之间的变表是变量间的概率相关关系.根据边的性质不同,可以将概率图模型分为两类:一类是使用有向无环图表示变量间的依赖关系,称为有向图模型或贝叶斯网:另一类是使用无向图表示变量间的相关关系,称为无向图模型或马尔科夫网. 隐马尔科夫模型(简称HMM)是结构最简单的动态贝叶斯网,是一种著名的有向图模型,主要用于时间序数据建模,在语音识别,自然语言处理,生物信息,模式识别中有着广泛的应用,虽

《概率统计》14.状态解码:隐马尔科夫模型隐含状态揭秘

隐含状态解码问题的描述 上一篇我们讲完了概率估计问题,这里我们再来讲一下隐马尔科夫模型的状态解码问题. 解码 Decoding,就是给定一个已知的观测序列,求它最有可能对应的状态序列.那么用形式化的语言来说,就是已知模型λ = (A, B, π)和观测序列\(O = (o_{1},o_{2},...,o_{T})\),求使得条件概率P(I|O)最大的隐状态序列I = (\(i_{1},i_{2},...,i_{T}\)) 我们一步一步地来,先不考虑输出观测,仅仅只考虑隐状态的转移,来体会一下思路

一文搞懂HMM(隐马尔可夫模型)

本文转自于:http://www.cnblogs.com/skyme/p/4651331.html 隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程.其难点是从可观察的参数中确定该过程的隐含参数.然后利用这些参数来作进一步的分析,例如模式识别. 是在被建模的系统被认为是一个马尔可夫过程与未观测到的(隐藏的)的状态的统计马尔可夫模型. 下面用一个简单的例子来阐述: 假设我手里有三个不同的骰子.第一个骰子是我们平常见的骰子(称这