我正试图使用Viterbi算法在HMM上找到最可能的路径(即状态序列)。然而,我不知道跃迁和发射矩阵,我需要根据观测(数据)来估计。
要估计这些矩阵,我应该使用哪种算法:Baum-Welch还是Viterbi训练算法?为什么?
如果我应该使用维特比训练算法,有人能给我提供一个好的伪代码吗(不容易找到)?
如果有足够的资源,您可能应该使用Baum-Welch(前向-后向)算法,而不是Viterbi训练算法(也称为分段k-means算法),这是一种替代参数估计过程,为了计算效率牺牲了Baum-Welsh的一些通用性。一般来说,Baum-Welch算法会给出能带来更好性能的参数,尽管有时情况并非如此。这是一个很好的比较研究。
此外,请注意,您应该使用Baum-Welch算法来估计模型的参数。这使用类似于EM算法的东西来设置发射概率和传输概率。训练HMM后,您将使用Viterbi解码算法来计算可能产生您的观测结果的最可能的状态序列。
参考文献我推荐语音和语言处理、人工智能作为现代方法或本文
来源http://nlp.stanford.edu/courses/lsa352/lsa352.lec7.6up.pdf:
Viterbi训练与Baum-Welch:相比
- 更快
- 但效果不太好
- 但这种权衡往往是值得的
一些比较研究:
-
Rodríguez、Luis Javier和Inés Torres。"Baum-Welch和Viterbi训练算法应用于阅读和自发语音识别的比较研究。"载于伊比利亚模式识别和图像分析会议,第847-857页。施普林格-柏林-海德堡,2003年。
- https://pdfs.semanticscholar.org/e58c/7d1e9d64221e5f0b424f5e22b6dede369c8d.pdf(特别是,请参阅结论部分)
在统计学堆栈交换中也提出了同样的问题:Baum-Welch和Viterbi训练之间的差异。
你必须通过baum-welch算法来找出隐藏的马尔可夫模型参数。baum-welch利用前向和后向算法求出hmm参数。
我在python中有一个baum-welch算法代码的链接,只需检查一下:https://jyyuan.wordpress.com/2014/01/28/baum-welch-algorithm-finding-parameters-for-our-hmm/