2016-01-24 18 views
0

我使用scikit-learn的hmmlearn模塊運行一個簡單的HMM。它適用於完全觀察到的數據,但是當我通過缺失數據進行觀察時失敗。小例子:從scikit學到的hmmlearn中缺少數據

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.nanNone,但都不起作用。它給出了錯誤IndexError: arrays used as indices must be of integer (or boolean) type(在hmm.py", line 430, in _compute_log_likelihood)。

這怎麼能在hmmlearn中完成?

回答

1

目前沒有辦法使用hmmlearn進行缺少數據插補。

作爲一種特殊的方法,您可以將觀察序列劃分爲完全觀測的子序列,然後爲每個子序列選擇最可能的狀態和觀測值,或者從轉移和發射概率中隨機地進行模擬。請注意,此策略可能會導致子序列邊界不一致。

+0

加入下一個最有可能的序列的推斷將是真正有用的是有計劃添加它? – mvd

+0

目前我們專注於填補0.2.0版本的缺失部分。隨意打開[問題](https://github.com/hmmlearn/hmmlearn)。 –