⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 forwad.cpp

📁 HMM中经典的前向后向算法
💻 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 + -