如何在Python中使用hmmlearn运行隐马尔可夫模型?

我尝试使用来自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)

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注