隐马尔可夫模型中关于抛掷硬币问题的算法Word格式文档下载.docx
- 文档编号:20541306
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:6
- 大小:150.14KB
隐马尔可夫模型中关于抛掷硬币问题的算法Word格式文档下载.docx
《隐马尔可夫模型中关于抛掷硬币问题的算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《隐马尔可夫模型中关于抛掷硬币问题的算法Word格式文档下载.docx(6页珍藏版)》请在冰豆网上搜索。
所以这类随机过程被称为隐马尔科夫过程。
隐马尔可夫模型λ可以用一个五元组(S,V,A,B,π)表示,S为状态的集合:
V是一组输出符号组成的集合:
A是状态转移矩阵:
B为输出符号的概率分布:
Π为初始状态概率分布.
评估问题:
对于给定模型,求某个观察值序列的概率p(σ|λ);
解码问题:
对于给定模型和观察值序列,求可能性最大的状态序列;
学习问题:
对于给定的一个观察值序列,调整参数λ,使得观察值出现的概率p(σ|λ)最大。
下面求解抛掷硬币问题
得到序列O={HHHHTHTTTT}
1,基础解法
此方法会导致计算量过大,影响计算速度。
2,前向法
#include<
iostream>
cmath>
usingnamespacestd;
intmain()
{
doubleA[3][3]={{0.9,0.05,0.05},{0.45,0.1,0.45},{0.45,0.45,0.1}};
doubleB[3][2]={{0.5,0.5},{0.75,0.25},{0.25,0.75}};
doublepi[3]={0.33,0.33,0.34};
intO[10]={0,0,0,0,1,0,1,1,1,1};
doublestart[8][3];
//初始化
for(inti=0;
i<
=2;
i++)
{
start[0][i]=pi[i]*B[i][O[0]];
}
for(intj=1;
j<
=9;
j++)
for(intk=0;
k<
k++)
doublesum=0;
for(intl=0;
l<
l++)
{
sum+=start[j-1][l]*A[l][k];
}
start[j][k]=sum*B[k][O[j]];
}
doublep=0;
for(intm=0;
m<
m++)
p+=start[9][m];
cout<
<
p<
endl;
return0;
}
3,解码问题用viterbi算法
doubledelt[10][3];
intpersy[10][3];
delt[0][i]=pi[i]*B[i][O[0]];
persy[0][i]=0;
}//初始化
for(intt=1;
t<
t++)
for(intj=0;
{
doublemax1=0;
for(intii=0;
ii<
ii++)
if(max1<
=delt[t-1][ii]*A[ii][j]*B[j][O[t]])
{
max1=delt[t-1][ii]*A[ii][j]*B[j][O[t]];
persy[t][j]=ii;
}
delt[t][j]=max1;
}//迭代过程
intxulie[10];
doublemax2=0;
for(intiii=0;
iii<
iii++)
if(max2<
=delt[9][iii])
max2=delt[9][iii];
xulie[9]=iii;
for(inttt=8;
tt>
=0;
tt--)
xulie[tt]=persy[tt+1][xulie[tt+1]];
cout<
xulie[m]<
Viterbi算法比之穷举法在运算复杂度上有很大提高。
上面两个程序解决了“抛掷硬币”问题中的评估问题和解码问题,同样可以应用于语音识别,中文断词等方面。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 隐马尔可夫 模型 关于 抛掷 硬币 问题 算法