进入隐马尔可夫模型的观测中的可变时间步长

时间:2014-06-26 18:05:19

标签: python scikit-learn hidden-markov-models

我猜这是不可能的,至少在scikit-learn的标准HMM实现中,但我想问这个问题,看看是否有其他方法可以解决这个问题。

问题基本上是我想使用隐马尔可夫模型来拟合一组观察序列;但是,我所拥有的观察并不总是与同一时间步骤保持一致。因此,例如,我可能有两个我想用来拟合的序列:

obs1 = [1,2,3,4]
obs2 = [1,2,2,4]

然而,这些不一定是时间上均匀的间隔。所以可能会说obs1中的观察结果有时会被1,2,3,6观察到,obs2中的观察结果有时会被1,4,5,6观察到。因此将它们原样输入HMM似乎是错误的。

到目前为止我尝试的是"插值"观察结果使时间步长相同。所以上面的例子将成为:

obs1 = [1,2,3,3,3,4]
obs2 = [1,1,1,2,2,4]

这似乎对我的机器学习问题起作用相对较好;然而,由于大量的附加样本(观测相对稀疏,因此添加这些插值会增加数百个额外的观测值),它会大大减慢拟合。还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

我认为你已经找到了最简单的解决方案 - 如果它有效,我会继续。我想到了一些其他(可能的)解决方案。

  1. 尝试编码差分,即1,1,1,1,1,2,1可以是1,0,0,0,0,1,-1,而不是直接编码。这可能会让你“降低”高速率信号,只能在事情发生变化时查看状态。在通信中,这可能就像从BPSK(二进制相移键控)更改为DBPSK(差分二进制相移键控) - 您可以查看一些想法。

  2. 这些事件在概率意义上是否真的相关?也许您可以使用单独的HMM实际分解它们,然后使用每个概率来提供另一个分类器/统计决策。这可能是处理“多流量”的最简单方法,而不会因较低信号的上采样而产生大量浪费,尤其是在较低速率信号显着小于较高速率信号的情况下。

  3. 找到一个特征表示,将低速率信号编码到高速信号上。这将允许您组合成单个流,但可能无法节省任何计算时间。

  4. 您可以尝试随机对较高速率信号进行二次采样。您将丢失信息,但学到的整体模型可能仍然可用。与压缩感知相似的想法,尽管最好在大变化区域“花费”您的采样点。

  5. 正如@eickenberg所说,HMM在不久的将来会被称为HMMlearn(我相信0.16),所以要注意!