如何在隐马尔可夫模型中解码后将隐藏状态映射到相应的类别



我想使用隐马尔可夫模型(解码问题)预测隐藏状态。数据是绝对的。隐藏状态包括饥饿、休息、运动和电影。观察组包括Food, Home, Outdoor &康乐及艺术娱乐。我的程序首先是基于观察序列训练HMM (Baum-Welch算法)。然后我做解码(Viterbi算法)来预测隐藏状态序列。

我的问题是如何将结果(非负整数)映射到它们相应的类别,如Hungry或Rest。由于训练算法的不确定性,对于相同的数据,每次训练的参数都是不同的。因此,如果我像下面的代码那样做映射,每次隐藏状态序列都是不同的。

代码如下:

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))

这就是所谓的标签切换问题。该模型的对数似然求和了所有状态,因此与特定的排序无关。

就我所知,没有解决这个问题的通用方法。您可以尝试以下方法:

  • 找到一个部分标记的数据集,在其上运行predict,并使用预测将状态索引映射到相应的标签。
  • 对每个状态下可能的参数值进行启发式分析。这对于多项式来说可能很棘手,但如果你建模,例如加速度计数据,这是可能的。

Update:从标记数据猜测状态到标签映射的特别版本。

def guess_labels(hmm, X, labels):
    result = [None] * hmm.n_components
    for label, y_t in zip(labels, hmm.predict(X)):
        assigned = result[y_t]
        if assigned is not None:
            # XXX clearly for any real data there might be
            #     (and there will be) conflicts. Here we just blindly
            #     hope the ``assert`` never fires.
            assert assigned == label
        else:
            result[y_t] = label
    return result

相关内容

  • 没有找到相关文章

最新更新