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。
因此,状态的顺序是不同的。
我正在尝试使用 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。
因此,状态的顺序是不同的。