📄 forwad.cpp
字号:
/********向前算法************/
#include <iomanip.h>
#include <math.h>
#include <fstream.h>
#include "HMM.H"
void Forward(HMM *phmm,int T,int *O,double **alpha,double &pprob)
{
double sum;
int i,j,k,t;
for(t=0;t<T;t++)
{
for(j=0;j<phmm->N;j++)
{
if(t==0)
{
k=O[0];
alpha[0][j]=(phmm->pi[j])*(phmm->B[k][j]);
}
else if(t>0)
{
k=O[t];
sum=0.0;
for(i=0;i<phmm->N;i++)
sum+=alpha[t-1][i]*(phmm->A[i][j]);
alpha[t][j]=sum*(phmm->B[k][j]);
}
}
}
pprob=0.0;
for(int s=0;s<phmm->N;s++)
pprob+=alpha[T-1][s];
}
//带有比例因子的向前算法
void ForwardWithScale(HMM *phmm,int T,int *O,double **alpha,double *scale,double &pprob)
{
double sum;
int i,j,k,t;
//初始化
scale[0]=0.0;
for(i=0;i<phmm->N;i++)
{
k=O[0];
alpha[0][i]=(phmm->pi[i])*(phmm->B[k][i]);
scale[0]+=alpha[0][i];
}
for(j=0;j<phmm->N;j++)
alpha[0][j]/=scale[0];
//递归
for(t=1;t<T;t++)
{
scale[t]=0.0;
for(j=0;j<phmm->N;j++)
{
k=O[t];
sum=0.0;
for(i=0;i<phmm->N;i++)
sum+=alpha[t-1][i]*(phmm->A[i][j]);
alpha[t][j]=sum*(phmm->B[k][j]);
scale[t]+=alpha[t][j];
}
for(j=0;j<phmm->N;j++)
alpha[t][j]/=scale[t];
}
pprob=0.0;
for(t=0;t<T;t++)
pprob+=log(scale[t]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -