维特比Viterbi算法Word文件下载.docx
- 文档编号:19752208
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:8
- 大小:18.27KB
维特比Viterbi算法Word文件下载.docx
《维特比Viterbi算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《维特比Viterbi算法Word文件下载.docx(8页珍藏版)》请在冰豆网上搜索。
解决前一个问题可以用与Viberbi结构非常类似的Forward算法来解决(实际上在下面合二为一),而后者可以用Baum-Welch/EM算法来迭代逼近。
从Wiki上抄一个例子来说明Viterbi算法。
假设你有一个朋友在外地,每天你可以通过电话来了解他每天的活动。
他每天只会做三种活动之一——Walk,Shop,Clean。
你的朋友从事哪一种活动的概率与当地的气候有关,这里,我们只考虑两种天气——Rainy,Sunny。
我们知道,天气与运动的关系如下:
Rainy
Sunny
Walk
0.1
0.6
Shop
0.4
0.3
Clean
0.5
例如,在下雨天出去散步的可能性是0.1。
而天气之前互相转换的关系如下,(从行到列)
0.7
例如,从今天是晴天而明天就开始下雨的可能性是0.4。
同时为了求解问题我们假设初始情况:
通话开始的第一天的天气有0.6的概率是Rainy,有0.4概率是Sunny。
OK,现在的问题是,如果连续三天,你发现你的朋友的活动是:
Walk->
Shop->
Clean;
那么,如何判断你朋友那里这几天的天气是怎样的?
解决这个问题的python伪代码如下:
defforward_viterbi(obs,states,start_p,trans_p,emit_p):
T={}
forstateinstates:
##prob.V.pathV.prob.
T[state]=(start_p[state],[state],start_p[state])
foroutputinobs:
U={}
fornext_stateinstates:
total=0
argmax=None
valmax=0
forsource_stateinstates:
(prob,v_path,v_prob)=T[source_state]
p=emit_p[source_state][output]*trans_p[source_state][next_state]
prob*=p
v_prob*=p
total+=prob
ifv_prob>
valmax:
argmax=v_path+[next_state]
valmax=v_prob
U[next_state]=(total,argmax,valmax)
T=U
##applysum/maxtothefinalstates:
(prob,v_path,v_prob)=T[state]
argmax=v_path
return(total,argmax,valmax)
几点说明:
1.算法对于每一个状态要记录一个三元组:
(prob,v_path,v_prob),其中,prob是从开始状态到当前状态所有路径(不仅仅是最有可能的viterbi路径)的概率加在一起的结果(作为算法附产品,它可以输出一个观察序列在给定HMM下总的出现概率,即forward算法的输出),v_path是从开始状态一直到当前状态的viterbi路径,v_prob则是该路径的概率。
2.算法开始,初始化T(T是一个Map,将每一种可能状态映射到上面所说的三元组上)
3.三重循环,对每个一活动y,考虑下一步每一个可能的状态next_state,并重新计算若从T中的当前状态state跃迁到next_state概率会有怎样的变化。
跃迁主要考虑天气转移(tp[source_state][next_state])与该天气下从事某种活动(ep[source_state][output])的联合概率。
所有下一步状态考虑完后,要从T中找出最优的选择viterbi路径——即概率最大的viterbi路径,即上面更新MapU的代码U[next_state]=(total,argmax,valmax)。
4.算法最后还要对T中的各种情况总结,对total求和,选择其中一条作为最优的viterbi路径。
5.算法输出四个天气状态,这是因为,计算第三天的概率时,要考虑天气转变到下一天的情况。
6.通过程序的输出可以帮助理解这一过程:
observation=Walk
next_state=Sunny
state=Sunny
p=0.36
triple=(0.144,Sunny->
0.144)
state=Rainy
p=0.03
triple=(0.018,Rainy->
0.018)
UpdateU[Sunny]=(0.162,Sunny->
Sunny->
next_state=Rainy
p=0.24
triple=(0.096,Sunny->
0.096)
p=0.07
triple=(0.042,Rainy->
0.042)
UpdateU[Rainy]=(0.138,Sunny->
Rainy->
observation=Shop
p=0.18
triple=(0.02916,Sunny->
0.02592)
p=0.12
triple=(0.01656,Sunny->
0.01152)
UpdateU[Sunny]=(0.04572,Sunny->
triple=(0.01944,Sunny->
0.01728)
p=0.28
triple=(0.03864,Sunny->
0.02688)
UpdateU[Rainy]=(0.05808,Sunny->
observation=Clean
p=0.06
triple=(0.0027432,Sunny->
0.0015552)
p=0.15
triple=(0.008712,Sunny->
0.004032)
UpdateU[Sunny]=(0.0114552,Sunny->
p=0.04
triple=(0.0018288,Sunny->
0.0010368)
p=0.35
triple=(0.020328,Sunny->
0.009408)
UpdateU[Rainy]=(0.0221568,Sunny->
finaltriple=(0.033612,Sunny->
所以,最终的结果是,朋友那边这几天最可能的天气情况是Sunny->
Rainy,它有0.009408的概率出现。
而我们算法的另一个附带的结论是,我们所观察到的朋友这几天的活动序列:
Clean在我们的隐马可夫模型之下出现的总概率是0.033612。
参考文献
1.http:
//www.ece.ucsb.edu/Faculty/Rabiner/ece259/Reprints/tutorial%20on%20hmm%20and%20applications.pdf
2.http:
//en.wikipedia.org/wiki/Viterbi_algorithm
3.
附:
c++主要代码片断
voidforward_viterbi(constvector<
string>
&
ob,viterbi_triple_t&
vtriple)
{
//alias
map<
string,double>
&
sp=start_prob;
string,map<
>
tp=transition_prob;
ep=emission_prob;
//initialization
InitParameters();
string,viterbi_triple_t>
T;
for(vector<
:
iteratorit=states.begin();
it!
=states.end();
++it)
viterbi_triple_tfoo;
foo.prob=sp[*it];
foo.vpath.push_back(*it);
foo.vprob=sp[*it];
T[*it]=foo;
}
U;
doubletotal=0;
vector<
argmax;
doublevalmax=0;
doublep=0;
const_iteratoritob=ob.begin();
itob!
=ob.end();
++itob)
cout<
<
“observation=”<
*itob<
endl;
U.clear();
iteratoritNextState=states.begin();
itNextState!
++itNextState)
“\tnext_state=”<
*itNextState<
total=0;
argmax.clear();
valmax=0;
iteratoritSrcState=states.begin();
itSrcState!
++itSrcState)
“\t\tstate=”<
*itSrcState<
viterbi_triple_tfoo=T[*itSrcState];
p=ep[*itSrcState][*itob]*tp[*itSrcState][*itNextState];
“\t\t\tp=”<
p<
foo.prob*=p;
foo.vprob*=p;
“\t\t\ttriple=”<
foo<
total+=foo.prob;
if(foo.vprob>
valmax)
foo.vpath.push_back(*itNextState);
argmax=foo.vpath;
valmax=foo.vprob;
U[*itNextState]=viterbi_triple_t(total,argmax,valmax);
“\tUpdateU["
<
"
]=”<
U[*itNextState]<
“”<
T.swap(U);
iteratoritState=states.begin();
itState!
++itState)
viterbi_triple_tfoo=T[*itState];
argmax.swap(foo.vpath);
vtriple.prob=total;
vtriple.vpath=argmax;
vtriple.vprob=valmax;
“finaltriple=”<
vtriple<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Viterbi 算法