我猜这是不可能的,至少使用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,1,1,1,1,2,1可以是1,0,0,0,0,0,0,1,-1。这可能会让您"降低"高速率信号,以便仅在实际情况发生变化时查看状态。在通信中,这将类似于从BPSK(二进制相移键控)更改为DBPSK(差分二进制相移键控)-您可以查看这些想法。
-
这些事件在概率意义上真的相关吗?也许你可以将它们分解为单独的hmm,然后使用每个概率来提供另一个分类器/统计决策。这可能是处理"多流率"的最简单的方法,而不会因为上采样较低的信号而造成明显的浪费,特别是如果较低的速率信号明显小于较高的速率。
-
找到一个特征表示将低速率信号编码到高速率信号上。这将允许您合并成单个流,但可能不会节省任何计算时间。
-
你可以尝试随机对高速率信号进行子采样。您可能会丢失信息,但学到的整体模型可能仍然可用。与压缩感知类似的想法,尽管在变化较大的区域周围"花费"采样点会更好。
正如@eickenberg所提到的,hmm将在不久的将来(我相信是0.16)进入自己的repo,称为HMMlearn,所以要注意!