Answers:
首先有一些背景知识,也许可以使事情变得更清晰。
在谈论HMM(隐马尔可夫模型)时,通常要考虑3个问题:
评价问题
解码问题
培训问题
综上所述,当在一组序列上训练模型时,可以使用Viterbi算法来解决解码问题,并使用Baum Welch / Forward-backward。
Baum Welch的工作方式如下。
对于序列训练集中的每个序列。
如果您需要有关维特比解码方程的完整描述,并且训练算法让我知道,我可以为您指明正确的方向。
向前-向后给出每种状态的边际概率,维特比给出最可能的状态序列的概率。例如,如果您的HMM任务是预测每天的晴天和阴雨天气,则“前进后退”将告诉您每天“晴天”的可能性,维特比会给出最可能的晴天/阴天的顺序,此序列的概率。
我发现{2}中的以下两张幻灯片非常适合将HMM使用的所有其他典型算法放在前向和后向算法和Viterbi算法中:
笔记:
参考文献:
莫拉特的答案在某一点上是错误的:Baum-Welch是一种Expectation-Maximization算法,用于训练HMM的参数。它在每次迭代过程中使用前向-后向算法。前向-后退算法实际上只是前向和后向算法的组合:一个向前通过,一个向后通过。向前-向后算法本身并不用于训练HMM的参数,而仅用于平滑:计算状态序列的边际似然。
https://zh.wikipedia.org/wiki/Forward%E2%80%93backward_algorithm
https://zh.wikipedia.org/wiki/鲍姆(Baum)%E2%80%93Welch_algorithm
@Yaroslav Bulatov有一个准确的答案。我将添加一个示例,以说明前进后退算法与维特比算法之间的区别。
假设我们有一个HMM(来自Wikipedia HMM页面)。注意,已经给出了模型,因此这里没有学习数据的任务。
假设我们的数据是长度为4的序列。(Walk, Shop, Walk, Clean)
。两种算法会给出不同的结果。
Sunny
Rainy
这是R
演示的一些代码
library(HMM)
# in education setting,
# hidden state: Rainy and Sunny
# observation: Walk, Shop, Clean
# state transition
P <- as.matrix(rbind(c(0.7,0.3),
c(0.4,0.6)))
# emission prob
R <- as.matrix(rbind(c(0.1, 0.4, 0.5),
c(0.6,0.3, 0.1)))
hmm = initHMM(States=c("Rainy","Sunny"),
Symbols=c("Walk","Shop", "Clean"),
startProbs=c(0.6,0.4),
transProbs=P,
emissionProbs=R)
hmm
obs=c("Walk","Shop","Walk", "Clean")
print(posterior(hmm,obs))
print(viterbi(hmm, obs))