📄 forward.cpp
字号:
/*
** File:forward.cpp
** 功能:给定观察值序列和HMM模型,利用前向算法求取其概率
*/
#include"StdAfx.h"
#include<stdio.h>
#include"hmm.h"
/***函数名称:Forward
**功能:后向算法估计参数
**参数:phmm:指向HMM的指针
** T:观察值序列的长度
** O:观察值序列
** alpha:运算中用到的临时数组
** pprob:返回值,所要求的概率***/
void Forward(HMM *phmm,int T,int *O,double **alpha,double *pprob)
{
int i,j; //状态下标
int t; //时间下标
double sum; //局部总和
//1,初始化
for(i=1;i<=phmm->N;i++)
alpha[1][i]=phmm->pi[i]*phmm->B[i][O[1]];
//2,递归
for(t=1;t<T;t++){
for(j=1;j<=phmm->N;j++){
sum=0.0;
for(i=1;j<=phmm->N;i++)
sum+=alpha[t][i]*(phmm->A[i][j]);
alpha[t+1][j]=sum*(phmm->B[j][O[t+1]]);
}
}
//3,终止
*pprob=0.0;
for(i=1;i<=phmm->N;i++)
*pprob+=alpha[T][i];
}
/*** 函数名称:Forward
** 功能:后向算法估计参数
** 参数:phmm:指向HMM的指针
** T:观察值序列的长度
** O:观察值序列
** alpha:运算中用到的临时数组
** scale:比例因子
** ppmh:返回值,所要求的概率***/
void ForwardWithScale(HMM*phmm,int T,int *O,double **alpha,double *scale,double *pprob)
// pprob是对数概率
{
int i,j; //状态下标
int t; //时间下标
double sum; //局部总和
//1,初始化
scale[1]=0.0;
for(i=1;i<=phmm->N;i++){
alpha[1][i]=phmm->pi[i]*(phmm->B[i][O[1]+1]);
scale[1]+=alpha[1][i];
}
for(i=1;i<=phmm->N;i++)
alpha[1][i]/=scale[1];
//2,递归
for(t=1;t<T;t++){
scale[t+1]=0.0;
for(j=1;j<=phmm->N;j++){
sum=0.0;
for(i=1;i<=phmm->N;i++)
sum+=alpha[t][i]*(phmm->A[i][j]);
alpha[t+1][j]=sum*(phmm->B[j][O[t+1]]);
scale[t+1]+=alpha[t+1][j];
}
for(j=1;j<=phmm->N;j++)
alpha[t+1][j]/=scale[t+1];
}
//3,终止
*pprob=0.0;
for(t=1;t<=T;t++)
*pprob+=log(scale[t]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -