隐马尔可夫模型（六）——隐马尔可夫模型的评估问题(前向后向相结合算法）

前向变量αt(i):在时刻t,在已知模型μ=（A,B,π）的条件下，状态处于si,输出序列为O102...Ot,前向变量为αt(i)

后向变量βt(i):在时刻t,在已知模型μ=（A,B,π）和状态处于si的条件下，输出序列为Ot+1Ot+2...OT,后向变量为βt(i)

P(O,qt=si|μ） = P(O1O2...OT, qt=si|μ）

=P(O1O2...Ot, qt=si,Ot+1Ot+2...OT|μ)

=P(O1O2...Ot, qt=si|μ) * P(Ot+1Ot+2...OT|O1O2...Ot, qt=si,μ)

=P(O1O2...Ot, qt=si|μ) * P(Ot+1Ot+2...OT|qt=si,μ)

=αt(i) *  βt(i)

P(O|μ）=

分析：

P(q4=s3|O,M) =  P(q4=s3, O|M)/P(O|M)

= P(O,q4=s3|M)/P(O|M)

= α4(3) *  β4(3)

程序：

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
float a[3][3] = {{0.5,0.2,0.3},{0.3,0.5,0.2},{0.2,0.3,0.5}};
float b[3][2] = {{0.5,0.5},{0.4,0.6},{0.7,0.3}};
float result_b[8][3];
float result_f[8][3];
float result, result_t;
int list[8] = {0,1,0,0,1,0,1,1};
result_b[7][0] = 1;
result_b[7][1] = 1;
result_b[7][2] = 1;
result_f[0][0] = 0.2 * 0.5;
result_f[0][1] = 0.4 * 0.4;
result_f[0][2] = 0.4 * 0.7;
//Backward
int i,j,k, count = 7;
for (i=6; i>=0; i--)
{
for(j=0; j<=2; j++)
{
result_b[i][j] = 0;
for(k=0; k<=2; k++)
{
result_b[i][j] += result_b[i+1][k] * a[j][k] * b[k][list[count]];
}
}
count -= 1;
}
for (i=0; i<=7; i++)
{
for(j=0; j<=2; j++)
{
printf("b[%d][%d]= %f\n",i+1,j+1, result_b[i][j]);

}
}
printf("Backward:%f\n", result_b[0][0]*0.2*0.5+result_b[0][1]*0.4*0.4+result_b[0][2]*0.4*0.7);
//Forward
count = 1;
for (i=1; i<=7; i++)
{
for(j=0; j<=2; j++)
{
result_f[i][j] = 0;
for(k=0; k<=2; k++)
{
result_f[i][j] += result_f[i-1][k] * a[k][j] * b[j][list[count]];
}
}
count += 1;
}
for (i=0; i<=7; i++)
{
for(j=0; j<=2; j++)
{
printf("a[%d][%d]= %f\n", i+1, j+1, result_f[i][j]);
}
}
result = result_f[7][0] + result_f[7][1] + result_f[7][2];
printf("Forward: %f\n", result);

result_t = 0;
for (i=0; i<=2; i++)
{
result_t += result_f[3][i] * result_b[3][i];
}
printf("Result:%f\n", result_f[3][2]*result_b[3][2]/result_t);

return 0;
}

运行结果

posted @ 2012-12-05 15:17  jihite  阅读(4328)  评论(1编辑  收藏