如何训练 HMM 进行分类?

机器算法验证 分类 隐马尔可夫模型
2022-03-23 08:55:09

所以我知道,当你训练 HMM 进行分类时,标准方法是:

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

但是我如何在每节课上训练 HMM?我是否只是将与一个类有关的数据连接在一起?但是,时间序列数据不是应该是连续的吗?如果我这样做,那么我是说某些数据点不是连续的?

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

这可以分为我从实验协议中知道的窗口(数据已标记),因此我可以为每个类收集 96*t 矩阵集。其中 t 小于 T 并表示每个窗口的大小。

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

目的是能够将 EEG 数据窗口分类为已对标记数据进行训练的给定心理状态。这是一个使用柏林 BCI 竞赛数据的脑机接口问题

1个回答

您描述的使用 HMM 进行分类的方法实际上仅适用于您具有要分类的独立序列的设置。例如,如果我将句子的情绪分类为正面或负面,我可以按照您的描述为每个句子构建一个 HMM。请参阅我在这里给出的相关答案请注意,这是如何建立在假设我可以在比较后验之前将序列分解成有意义的块进行分类的。这似乎不是你的问题,因为你实际上有一个大长度的时间序列。这是我会尝试的。T

你在reddit上提到过你对为每个类分配一个状态犹豫不决。你试过这个吗?它可能没有你想象的那么糟糕。在这种情况下,估计问题也容易得多。估计转换概率很容易,您只需从本质上进行计数。此外,您可以根据观察到的数据和相应的类别来拟合每个状态的发射概率,而忽略时间方面。

如果您确信这是一个坏主意,或者发现它表现不佳但仍想坚持使用生成模型,您可以使用分层 HMM 之类的东西。例如,您可以让顶层中的状态表示类,然后允许较低级别的 HMM 对类内的时间变化进行建模。你也可以使用一个大的 HMM 来实现类似的东西。如果你有个类别,为每个类别分配个状态(因此总共有 , ,在训练期间,您需要强制 HMM 仅分配正概率来转换到时间的状态,其中KNN×Kskik=1,,Ki=1,Ntk在时间与标签匹配。我的措辞可能有点尴尬,所以我希望我的意思很清楚。显然,您可以将其概括为每个类具有不同数量的状态。您可能还可以使用其他类型的动态贝叶斯网络。凯文墨菲的论文是一个很好的参考。他还讨论了将 HHMM 转换为 HMM。t

最后,您可以切换到判别模型,例如条件随机场。判别模型将允许您轻松合并更复杂的特征并更直接地解决手头的问题(估计条件密度)。这可能是我首先要尝试的。