下面的代码是我在hmm模型中找到的viterbi算法的一个python实现。该链接还提供了一个测试用例。
在__init__
中,我了解到:initialProb
是从给定状态开始的概率,transProb
是在任何给定时间从一种状态移动到另一种状态的概率,但是
我不明白的参数是obsProb
有人能解释一下吗?
import numpy as np
'''
N: number of hidden states
'''
class Decoder(object):
def __init__(self, initialProb, transProb, obsProb):
self.N = initialProb.shape[0]
self.initialProb = initialProb
self.transProb = transProb
self.obsProb = obsProb
assert self.initialProb.shape == (self.N, 1)
assert self.transProb.shape == (self.N, self.N)
assert self.obsProb.shape[0] == self.N
def Obs(self, obs):
return self.obsProb[:, obs, None]
def Decode(self, obs):
trellis = np.zeros((self.N, len(obs)))
backpt = np.ones((self.N, len(obs)), 'int32') * -1
# initialization
trellis[:, 0] = np.squeeze(self.initialProb * self.Obs(obs[0]))
for t in xrange(1, len(obs)):
trellis[:, t] = (trellis[:, t-1, None].dot(self.Obs(obs[t]).T) * self.transProb).max(0)
backpt[:, t] = (np.tile(trellis[:, t-1, None], [1, self.N]) * self.transProb).argmax(0)
# termination
tokens = [trellis[:, -1].argmax()]
for i in xrange(len(obs)-1, 0, -1):
tokens.append(backpt[tokens[-1], i])
return tokens[::-1]
最佳答案
aHMM具有N
隐藏状态和M
可能的离散观测值由以下参数定义:initialProb
(大小向量):初始状态分布。条目N
是最初(在时间0时)处于initialProb[i]
状态的概率P(x_0 = i)
。i
(大小矩阵transProb
xN
):转移概率矩阵。条目N
是从状态transProb[i][j]
过渡到P(x_{t+1} = j | x_t = i)
的概率。i
(尺寸矩阵j
xobsProb
):发射概率矩阵条目N
是从状态M
发射符号obsProb[i][j]
的概率P(y_t = j | x_t = i)
。
通常,这些参数分别命名为j
、i
和\pi
,或者分别命名为T
、E
和\pi
。
顺便说一下,hmms上的标准参考是tutorial by Rabiner。