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

📄 forward.cpp

📁 HMM模型的C语言实现
💻 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 + -