初始化HiddenMarkovModelTrainer对象

2 投票
1 回答
1866 浏览
提问于 2025-04-17 10:41

我正在用Python做手势识别,找到的一个比较完整的库是nltk,它可以处理隐马尔可夫模型(HMM)。不过,有些地方我不太明白。

首先是数据。我有手势的坐标,并且我把这些坐标分成了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是训练用的数据(在我的情况下是标签) - alphabet是数据可能的值(在我的情况下是0,1,2,3,4,5,6,7) - H是隐藏状态的数量

现在我有点困惑,因为在nltk.HiddenMarkovModelTrainer的构造函数中,我需要提供statessymbols,但我不知道该填什么。考虑到训练数据X是HiddenMarkovModelTrainer.train_unsupervised()方法的输入,我觉得我的alphabet就是symbols,但我不知道states该填什么。

希望我的解释清楚,即使我的英语不太好。

1 个回答

4

隐马尔可夫模型之所以叫这个名字,是因为它的实际状态是看不见的;相反,这些状态会以一定的概率产生观察结果。隐马尔可夫模型在NLTK中的经典用法是词性标注,其中观察结果是单词,而隐藏的内部状态是词性标签。想要理解在这种情况下statessymbols参数的含义,可以看看这个例子

在使用隐马尔可夫模型进行手势识别时,观察结果是某种特征建模的时间序列(symbols),这些特征是对几何输入数据的描述——在你的案例中,你使用的是聚类(也叫“分区”,可以参考这篇论文的3.2节,了解其他可能的模型)。我理解的内部状态集合并没有什么特别的含义。用于训练每个手势的隐马尔可夫模型的内部状态数量只是一个需要实验的参数。例如,可以参考这篇论文(“Yamato, Ohya, Ishii. 使用HMM识别时间序列图像中的人类动作”)——其中状态数量设置为36,这在这篇硕士论文中被批评为过高,仅仅是举个例子说明这是一个可以调整的参数。

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

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

撰写回答