R 中的 HMM 包用法

HMM Package Usage in R

我正在尝试使用 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"

有什么问题?

HMM 包使用稍微不同的算法来计算最可能的状态路径。您可以阅读有关实现的信息 here.

例如,在给定的示例中,周二晴天的远期概率 = max(0.533*0.8*0.8, 0.133*0.4*0.8) = 0.341

然而,使用 HMM 包中的函数 forward() 我们获得: 0.533*0.8*0.8 + 0.133*0.4*0.8 = 0.384。

因此,状态的顺序是不同的。