我在其文档中的一个简单示例中应用稍微更改时遇到hidden_markov包的问题。在下面的代码中,我尝试了2个状态和3个可能的观察结果(在文档的示例中有2个可能的观察结果,代码工作正常):
states = ('s', 't')
possible_observation = ('A', 'B', 'C')
# Numpy arrays of the data
start_probability = np.matrix( '0.5 0.5')
transition_probability = np.matrix('0.6 0.4 ; 0.3 0.7')
emission_probability = np.matrix( '0.3 0.2 0.5 ; 0.3 0.1 0.6')
# Initialize class object
test = hmm(states,possible_observation,
start_probability,
transition_probability,
emission_probability)
observations = ('A', 'B','B','A', 'C')
obs4 = ('B', 'C', 'A','B')
observation_tuple = []
observation_tuple.extend( [observations,obs4] )
quantities_observations = [18, 28]
num_iter=1000
e,t,s = test.train_hmm(observation_tuple,num_iter,quantities_observations)
运行代码后,我收到错误:
ValueError: operands could not be broadcast together with shapes (2,3) (1,2)
有趣的是,当我尝试3个状态和3个可能的观察(并根据此变化修改概率矩阵)时,代码工作正常。要么我缺少某些东西,要么状态和可能的观察总数应该相等,这是没有意义的。
基于您在上面提供的矩阵,只有两个矩阵的形状为(2,3)
和(1,2)
,分别为emission_probability
和start_probability
,误差是矩阵维度不匹配。要匹配矩阵尺寸,以便它们可以用于计算点积。
emission_probability = emission_probability.T
start_probability = start_probability.T
必须在初始化类对象之前完成此步骤。