typedef struct { int N; /* 隐藏状态数目;Q={1,2,…,N} */ int M; /* 观察符号数目; V={1,2,…,M}*/ double **A; /* 状态转移矩阵A[1..N][1..N]. a[i][j] 是从t时刻状态i到t+1时刻状态j的转移概率 */ double **B; /* 混淆矩阵B[1..N][1..M]. b[j][k]在状态j时观察到符合k的概率。*/ double *pi; /* 初始向量pi[1..N],pi[i] 是初始状态概率分布 */ } HMM; /* 函数参数说明: *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. 初始化:计算t=1时刻所有状态的局部概率: */ for (i = 1; i <= phmm->N; i++) alpha[1][i] = phmm->pi[i]* phmm->B[i][O[1]]; /* 2. 归纳:递归计算每个时间点,t=2,… ,T时的局部概率 */ for (t = 1; t < T; t++) { 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]]); } } /* 3. 终止:观察序列的概率等于T时刻所有局部概率之和*/ *pprob = 0.0; for (i = 1; i <= phmm->N; i++) *pprob += alpha[T][i]; }