我正在使用scikit-learn的hmmlearn
模块运行一个简单的隐马尔可夫模型(HMM)。它对完全观测的数据有效,但当我传入包含缺失数据的观测时,它就失败了。下面是一个小例子:
import numpy as npimport hmmlearnimport hmmlearn.hmm as hmmtransmat = np.array([[0.9, 0.1], [0.1, 0.9]])emitmat = np.array([[0.5, 0.5], [0.9, 0.1]])# 这不起作用:不能有缺失数据obs = np.array([0, 1] * 5 + [np.nan] * 5)# 这有效#obs = np.array([0, 1] * 5 + [1] * 5)startprob = np.array([0.5, 0.5])h = hmm.MultinomialHMM(n_components=2, startprob=startprob, transmat=transmat)h.emissionprob_ = emitmatprint obs, type(obs)posteriors = h.predict_proba(obs)print posteriors
如果obs
是完全观测的(每个元素都是0或1),它可以工作,但我希望能对未观测的数据点进行估计。我尝试用np.nan
或None
来编码这些数据,但这两种方法都不起作用。它会报错IndexError: arrays used as indices must be of integer (or boolean) type
(在hmm.py", line 430, in _compute_log_likelihood
中)。
在hmmlearn中如何处理这个问题?
回答:
目前使用hmmlearn
无法进行缺失数据的插补。
作为一种临时方法,你可以将观测序列分割成完全观测的子序列,然后对于每个子序列,要么选择最可能的下一个状态和观测,要么从转移和发射概率中随机模拟它们。请注意,这种策略可能会在子序列边界上导致不一致性。