我尝试使用来自GitHub的hmmlearn来运行一个二元隐马尔可夫模型,但没有成功:
import hmmlearn.hmm as hmmtransmat = np.array([[0.7, 0.3], [0.3, 0.7]])emitmat = np.array([[0.9, 0.1], [0.2, 0.8]])obs = np.array([0, 0, 1, 0, 0])startprob = np.array([0.5, 0.5])h = hmm.MultinomialHMM(n_components=2, startprob=startprob, transmat=transmat)h.emissionprob_ = emitmat# 失败h.fit([0, 0, 1, 0, 0])# 失败h.decode([0, 0, 1, 0, 0])print h
我得到了这个错误:
ValueError: 无法连接零维数组
如何正确使用这个模块?请注意,我使用的是从sklearn中分离出来的hmmlearn版本,因为显然sklearn不再维护hmmlearn了。
回答:
fit函数接受的是序列列表,而不是单个序列(因为通常情况下你可以有多个独立序列,这些序列是来自不同实验/观察的运行结果)。因此,只需将你的列表再放入一个列表中即可
import hmmlearn.hmm as hmmimport numpy as nptransmat = np.array([[0.7, 0.3], [0.3, 0.7]])emitmat = np.array([[0.9, 0.1], [0.2, 0.8]])startprob = np.array([0.5, 0.5])h = hmm.MultinomialHMM(n_components=2, startprob=startprob, transmat=transmat)h.emissionprob_ = emitmat# 运行正常h.fit([[0, 0, 1, 0, 0]]) # h.fit([[0, 0, 1, 0, 0], [0, 0], [1,1,1]]) # 这就是这种语法的原因,你可以拟合到多个序列 print h.decode([0, 0, 1, 0, 0])print h
结果如下
(-4.125363362578882, array([1, 1, 1, 1, 1]))MultinomialHMM(algorithm='viterbi', init_params='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', n_components=2, n_iter=10, params='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', random_state=<mtrand.RandomState object at 0x7fe245ac7510>, startprob=None, startprob_prior=1.0, thresh=0.01, transmat=None, transmat_prior=1.0)