初始化HiddenMarkovModelTrainer对象

时间:2012-01-20 12:11:42

标签: python machine-learning nltk hidden-markov-models

我在python中进行手势识别,而我发现可以管理隐藏马尔可夫模型的更完整的库是 nltk 。但有一些我无法理解的东西。

首先,数据。我有手势的坐标,我已经将它们聚集在8个群集中(使用k-means)。所以这是我的手势结构:

raw coordinates x,y: [[123,16], [120,16], [115,16], [111,16], [107,16], [103,17], ...]

centroids x,y : [[ 132.375        56.625     ]
                 [ 122.45454545   30.09090909]
                 [  70.5          27.33333333]
                 ...]

labels: [5 6 6 6 6 6 6 2 2 2 2 2 2 4 4 4 ...]

现在我想和Baum-Welch一起训练HMM。所以HiddenMarkovModelTrainer是我的班级。

我在互联网上发现了一些baum welch的实现,但仅限于Matlab。这个算法的实现需要这个输入:

baum-welch(X, alphabet, H)

,其中   - X是火车的数据(在我的情况下 - 标签)   - 字母表中数据的可能值(在我的例子中为0,1,2,3,4,5,6,7)   - H隐藏状态的数量

现在我很困惑,因为在ntlk.HiddenMarkovModelTrainer构造函数中我必须提供状态符号而我不知道它们应该是什么,考虑到数据到火车X是HiddenMarkovModelTrainer.train_unsupervised()方法的影响我认为我的字母表是符号..我不知道在州里放什么。

我希望即使我的英语很差,我的解释也很明确。

1 个答案:

答案 0 :(得分:4)

隐藏的马尔可夫模型被称为因为它们的实际状态是不可观察的;相反,各州以一定的概率产生观察。 NLTK中HMM的经典使用是POS标记,其中观察是单词,隐藏的内部状态是POS标记。请查看this example,了解statessymbols参数在这种情况下的含义。

对于使用HMM进行手势识别,观察结果是几何输入数据的某种特征建模(symbols)的时间序列 - 在您的情况下,您使用聚类(也称为“分区” - 请参阅{{ 3}}用于其他一些可能的模型)。根据我的理解,这套内部国家没有任何有意义的解释。针对每个手势训练HMM所使用的内部状态的数量仅仅是必须进行实验的参数。例如,请参阅section 3.2 of this paper ("Yang, Xu. Hidden Markov Model for Gesture Recognition") - 状态数设置为36,在this paper ("Yamato, Ohya, Ishii. Recognizing Human Action in Time-Sequential Images using HMM")中被批评为过高,只是举一个例子,这是一个可修改的参数。

所以我会尝试使用这段代码:

observed_sequence = [5, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 4, 4, 4]
states = range(20) # experiment with this number
symbols = set(observed_clusters)
trainer = HiddenMarkovModelTrainer(states, symbols)
model = trainer.train_unsupervised([observed_sequence])