hmm java_HMM后向算法(java实现)

该博客详细介绍了后向算法在隐马尔科夫模型(HMM)中的应用,用于计算观测序列的概率。首先,定义了后向变量矩阵,并通过初始化和归纳计算填充该矩阵。接着,利用后向矩阵计算观测序列的概率。博客还提供了计算过程的代码实现,包括关键的`CalculateBackMatrix`和`logProb`方法。
摘要由CSDN通过智能技术生成

package hmm.model;

import hmm.bean.HMMHelper;

import 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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值