概率计算算法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()); //后向算法
}
}