隐马尔可夫模型(HHM)学习笔记1.1

概率计算算法Java实现

依据我整理的笔记

前向算法
public class ProbabilityCalculate {
	
	double A[][];  //状态变量转换的概率
	double B[][];  //获取各种观测变量的概率
	double Pi[];   //初始状态概率
	int T;  //观测时序
	int N;  //状态变量的种类
	//--------------------------->>>j
	int matrix_x[];  //观测序列,元素对应B[i][j]的j
	
	public ProbabilityCalculate(double A[][], double B[][], double Pi[], int matrix_x[]) {
		this.A = A; this.B = B; this.Pi = Pi;
		this.T= matrix_x.length; this.N = A.length;
		this.matrix_x = matrix_x;
	}
	//前向算法
	//后向算法
	void print() {  //打印
	}
	
}

前向算法

double forwardCalculate() {  //前向算法
		double alpha[][] = new double[T][N];  //T行N列
		//alpha初始值
		for(int i = 0; i < N; i ++) {
			alpha[0][i] = Pi[i] * B[i][matrix_x[0]];
		}
		//递推
		for(int t = 1; t < T; t ++) {
			for(int i = 0; i < N; i ++) {
				for(int j = 0; j < N; j ++) {  //累加
					alpha[t][i] = alpha[t][i] + alpha[t - 1][j] * A[j][i];
				}
				alpha[t][i] = alpha[t][i] *B[i][matrix_x[t]];
			}
		}
		//终止
		double probability = 0.0;
		for(int i = 0; i < N; i ++) {
			probability = probability + alpha[T -1][i];
		}
		return probability;
	} 

后向算法

double backwardCalculate() {  //后向算法
		double beta[][] = new double[T][N];  //T行N列
		//beta初始值
		for(int i = 0; i < N; i ++) {
			beta[T - 1][i] = 1.0;
		}
		//递推
		for(int t = T - 2; t >=0; t --) {
			for(int i = 0; i < N; i ++) {
				for (int j = 0; j < N; j ++) {  //累加
					beta[t][i] = beta[t][i] + A[i][j] * B[j][matrix_x[t + 1]] * beta[t + 1][j];
				}
			}
		}
		//终止
		double probability = 0.0;
		for(int i = 0; i < N; i ++) {
			probability = probability + Pi[i] * B[i][matrix_x[0]] * beta[0][i];
		}
		
		return probability;
	}

main

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		double[][] A = {{0.5, 0.2, 0.3}, {0.3, 0.5, 0.2}, {0.2, 0.3, 0.5}};
		double[][] B = {{0.5, 0.5}, {0.4, 0.6}, {0.7, 0.3}};
		double[] Pi = {0.2, 0.4, 0.4};
		//要将观测序列转换为矩阵B的纵坐标j,B[i][j],0开始
		//--------------------------->>>j
		int[] matrix_x = {0, 1, 0};
		
		ProbabilityCalculate ball = new ProbabilityCalculate(A, B, Pi, matrix_x); 
		System.out.println(ball.forwardCalculate());  //前向算法
		System.out.println(ball.backwardCalculate());  //后向算法
		
	}

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值