hmmlearn 中缺少来自 scikit-learn 的数据
missing data in hmmlearn from scikit-learn
我是 运行 一个使用 scikit-learn 的 hmmlearn
模块的简单 HMM。它适用于完全观察到的数据,但是当我将缺少数据的观察结果传递给它时它会失败。小例子:
import numpy as np
import hmmlearn
import hmmlearn.hmm as hmm
transmat = np.array([[0.9, 0.1],
[0.1, 0.9]])
emitmat = np.array([[0.5, 0.5],
[0.9, 0.1]])
# this does not work: cannot have missing data
obs = np.array([0, 1] * 5 + [np.nan] * 5)
# this works
#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_ = emitmat
print 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
进行缺失数据插补。
作为一种临时方法,您可以将观察序列划分为完全观察到的子序列,然后为每个子序列选择最可能的 next 状态和观察,或者只是从中随机模拟它们过渡和发射概率。请注意,此策略可能导致子序列边界不一致。
我是 运行 一个使用 scikit-learn 的 hmmlearn
模块的简单 HMM。它适用于完全观察到的数据,但是当我将缺少数据的观察结果传递给它时它会失败。小例子:
import numpy as np
import hmmlearn
import hmmlearn.hmm as hmm
transmat = np.array([[0.9, 0.1],
[0.1, 0.9]])
emitmat = np.array([[0.5, 0.5],
[0.9, 0.1]])
# this does not work: cannot have missing data
obs = np.array([0, 1] * 5 + [np.nan] * 5)
# this works
#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_ = emitmat
print 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
进行缺失数据插补。
作为一种临时方法,您可以将观察序列划分为完全观察到的子序列,然后为每个子序列选择最可能的 next 状态和观察,或者只是从中随机模拟它们过渡和发射概率。请注意,此策略可能导致子序列边界不一致。