?? 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 + -