我想使用隐马尔可夫模型(解码问题)预测隐藏状态。数据是分类的。隐藏状态包括饥饿、休息、锻炼和电影。观察集包括食物、家庭、户外和娱乐以及艺术和娱乐。我的程序是首先根据观察序列(Baum-Welch 算法)训练 HMM。然后我进行解码(维特比算法)来预测隐藏状态序列。
我的问题是我如何将结果(非负整数)映射到它们相应的类别,如饥饿或休息。由于训练算法的非确定性特性,对于相同数据的每次训练,参数都是不同的。因此,如果我像下面的代码那样做地图,隐藏状态序列每次都是不同的。
代码如下:
from __future__ import division
import numpy as np
from hmmlearn import hmm
states = ["Hungry", "Rest", "Exercise", "Movie"]
n_states = len(states)
observations = ["Food", "Home", "Outdoor & Recreation", "Arts & Entertainment"]
# The number in this sequence is the index of observation
category_sequence = [1, 0, 1, 2, 1, 3, 1]
Location = np.array([category_sequence]).T
model = hmm.MultinomialHMM(n_components=n_states).fit(Location)
logprob, result = model.decode(Location)
print "Category:", ", ".join(map(lambda x: observations[x], Location.T[0]))
print "Intent:", ", ".join(map(lambda x: states[x], result))