我正在尝试使用HMM包在R中实现以下隐马尔可夫模型的示例:
https://github.com/luisguiserrano/hmm/blob/master/Simple%20HMM.ipynb
这是我的R代码:
states = c("S", "R")
symbols = c("H", "G")
startProbs = c(2/3, 1/3)
transProbs = matrix(c(0.8, 0.4, 0.2, 0.6), 2)
emissionProbs = matrix(c(0.8, 0.4, 0.2, 0.6), 2)
# Initialise HMM
hmm = initHMM(States = states, Symbols = symbols, startProbs = startProbs, transProbs = transProbs, emissionProbs = emissionProbs)
observations = c("H", "H", "G", "G", "G", "H")
print(exp(forward(hmm,observations)))
viterbi = viterbi(hmm,observations)
print(viterbi)
但是,我得到了不同的结果:
> print(exp(forward(hmm,observations)))
states 1 2 3 4 5 6
S 0.5333333 0.38400000 0.06741333 0.01662293 0.005408085 0.008057214
R 0.1333333 0.07466667 0.07296000 0.03435520 0.014362624 0.003879677
> print(viterbi)
"S" "S" "R" "R" "R" "S"
结果应为:
"S" "S" "S" "R" "R" "S"
出什么问题了?
答案 0 :(得分:2)
HMM
软件包使用略有不同的算法来计算最可能的状态路径。您可以阅读有关实现here的信息。
例如,在给定的示例中,周二Sunny的前进概率= max(0.533 * 0.8 * 0.8,0.133 * 0.4 * 0.8)= 0.341
但是,使用forward()
包中的函数HMM
,我们可以获得:
0.533 * 0.8 * 0.8 + 0.133 * 0.4 * 0.8 = 0.384。
因此,状态顺序是不同的。