我在Python中进行手势识别,发现了一个比较完整的库nltk,它可以处理隐马尔可夫模型。但我有一些不明白的地方。
首先是数据。我有手势的坐标,并将它们聚类到了8个簇(使用k-means)。所以这是我的手势结构:
原始坐标 x,y: [[123,16], [120,16], [115,16], [111,16], [107,16], [103,17], ...]
中心点 x,y : [[ 132.375 56.625 ]
[ 122.45454545 30.09090909]
[ 70.5 27.33333333]
...]
标签: [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 是隐藏状态的数量
现在我很困惑,因为在ntlk.HiddenMarkovModelTrainer的构造函数中,我需要提供states和symbols,我不知道它们应该是什么,考虑到训练数据X是HiddenMarkovModelTrainer.train_unsupervised()方法的输入,我认为我的alphabet是symbol..我不知道在states中应该放什么。
尽管我的英语不好,我希望我的解释是清楚的。
回答:
隐马尔可夫模型之所以如此命名,是因为它们的实际状态不可观察;相反,状态以一定的概率产生观察。NLTK中HMM的经典用途是词性标注,其中观察是词,而隐藏的内部状态是词性标签。查看这个例子,以理解在这种情况下states
和symbols
参数的含义。
对于使用HMM进行手势识别,观察是某种特征建模(symbols
)的几何输入数据的时间序列 – 在你的情况下,你使用了聚类(也称为“分区” – 参见这篇论文的第3.2节(“Yang, Xu. Hidden Markov Model for Gesture Recognition”)以了解其他可能的模型)。据我所知,内部状态集没有任何有意义的解释。用于训练每个手势的HMM的内部状态数量只是一个需要实验的参数。例如,参见这篇论文(“Yamato, Ohya, Ishii. Recognizing Human Action in Time-Sequential Images using HMM”) – 状态数量设置为36,这在这篇硕士论文中被批评为过高,这只是一个可修改参数的例子。
所以我会尝试使用以下代码:
observed_sequence = [5, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 4, 4, 4]
states = range(20) # 实验这个数字
symbols = set(observed_clusters)
trainer = HiddenMarkovModelTrainer(states, symbols)
model = trainer.train_unsupervised([observed_sequence])