我在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()方法的影响我认为我的字母表是符号..我不知道在州里放什么。
我希望即使我的英语很差,我的解释也很明确。
答案 0 :(得分:4)
隐藏的马尔可夫模型被称为因为它们的实际状态是不可观察的;相反,各州以一定的概率产生观察。 NLTK中HMM的经典使用是POS标记,其中观察是单词,隐藏的内部状态是POS标记。请查看this example,了解states
和symbols
参数在这种情况下的含义。
对于使用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])