如何训练HMM进行分类?


12

因此,我了解到,在训练HMM进行分类时,标准方法是:

  1. 将您的数据集分为每个类别的数据集
  2. 每班训练一名HMM
  3. 在测试集中比较每个模型对每个窗口进行分类的可能性

但是,我该如何在每堂课上训练HMM?我是否只是将有关一类的数据串联在一起?但是时间序列数据不是按顺序排列的吗?如果我这样做,那是说某些数据点是连续的,而不是连续的吗?

更具体地说,我有一些EEG数据,它是一个96xT矩阵,其中有96个特征向量,这些特征向量是来自不同通道的不同频率的功率谱密度,T是信号的时间长度(在某些采样率下)

可以将其划分为多个窗口,这些窗口可以从实验协议中得知(数据带有标签),因此我可以为每个类收集96 * t矩阵的集合。其中t小于T并表示每个窗口的大小。

然后如何在此数据上训练HMM?如果有帮助,我尝试使用pmtk3工具包,但我愿意使用任何东西-它必须能够处理实值观测值,因为功率谱密度是连续的而不是离散的(默认的MATLAB工具箱只能处理离散观察)。

目的是能够根据训练过的标记数据将脑电数据窗口分类为给定的心理状态。它是使用Berlin BCI Competition数据的人机界面问题。


1
请问这个页面适合你需要什么?
Merours

看来-我会尝试确定。它肯定允许使用高斯模型和高斯模型的混合,而不仅仅是多项式。 看来您可以在多个观测值上全局训练模型, 因此看起来不错。无论如何,我一直想正确地学习Python,因为它具有更广泛的用途。谢谢:)
Alex McMurray 2014年

Answers:


9

您描述的使用HMM进行分类的方法实际上仅适用于您具有要分类的独立序列的设置。例如,如果我将句子的情感分类为肯定或否定,则可以按照您的描述为每个句子构建HMM。请参阅我在此处给出的相关答案。请注意,这是基于这样的假设:在比较后验之前,我可以将序列分解为有意义的块进行分类。对于您来说,问题似乎并非如此,因为您实际上拥有一个较长的时间序列。这是我会尝试的。T

您在reddit上提到您不愿意为每个类分配一个状态。你有尝试过吗?它可能没有您想象的那么差。在这种情况下,估计问题也非常容易。估算过渡概率很容易,您只需要数一数即可。此外,您只需要根据观察到的数据和相应的类来拟合每个状态的发射概率,而无需考虑时间方面。

如果您确信这不是一个好主意,或者发现它的性能较差,但仍然希望使用生成模型,则可以使用“分层HMM”之类的方法。例如,您可以让顶层的状态代表类,然后允许低层的HMM对类内的时间变化建模。您也可以使用一个大型HMM来实现类似的功能。如果你有类,分配状态为每个类(因此的形式的共状态),,。在训练期间,您将需要强制HMM仅将正概率分配给时间处的状态过渡,其中KNN×Kskik=1,,Ki=1,Ntk在时间匹配标签。我可能措辞有些尴尬,所以我希望我的意思很清楚。显然,您可以将其概括为每个类具有不同数量的状态。您可能还可以使用其他类型的动态贝叶斯网络。凯文·墨菲(Kevin Murphy)的论文是极好的参考。他还讨论了将HHMM转换为HMM。t

最后,您可以切换到判别模型,例如条件随机字段。判别模型将使您能够轻松地合并更复杂的功能,并更直接地解决当前的问题(估计条件密度)。这可能是我首先尝试的方法。


观测值是连续的,因此我适合高斯或GMM。如reddit所讨论,这限制了模型的功能。我正在使用此模型来查看与静态模型相比,时间方面如何影响分类准确性。我知道判别模型可能对分类更好,并且已经读懂了墨菲的论文。这似乎很有趣,但是我的教授向我推荐了HMM(这是一个开放式项目),所以我会尝试的。不过,我希望将来能更多地使用EEG / MEG信号,因此我将在某些时候尝试其他方法。:)
Alex McMurray 2014年

1
最后,我将sklearn及其支持用于多种观察。它似乎正常工作。我应该深入研究代码,看看它实际上如何处理它。
Alex McMurray 2014年

1
亚历克斯,您能否提供一个链接或示例,称为“ sklearn及其对多种观测的支持”?我一直在处理这个问题(以及有关如何“告诉” HMM多个观测值属于一个类标签的相关问题)很多年了,很想知道您如何解决它们。
Rubenulis 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.