1.和2.是正确的。你必须小心你的初始转换和发射矩阵不是完全一致的,它们应该稍微随机化以便训练起作用。
3.我只会分别输入“Hello”序列,而不是将它们连接起来形成一个长序列。
假设这是 Hello: 的序列 [1,0,1,1,0,0]
。如果你从 3 个“Hello”序列中形成一个长序列,你会得到:
data = [1,0,1,1,0,0,1,0,1,1,0,0,1,0,1,1,0,0]
这并不理想,相反,您应该分别输入序列,例如:
data = [1,0,1,1,0,0; 1,0,1,1,0,0; 1,0,1,1,0,0]
.
由于您使用的是 MatLab,我建议您使用 Murphy 的HMM 工具箱。它有一个关于如何训练具有多个观察序列的 HMM 的演示:
M = 3;
N = 2;
% "true" parameters
prior0 = normalise(rand(N ,1));
transmat0 = mk_stochastic(rand(N ,N ));
obsmat0 = mk_stochastic(rand(N ,M));
% training data: a 5*6 matrix, e.g. 5 different 'Hello' sequences of length 6
number_of_seq = 5;
seq_len= 6;
data = dhmm_sample(prior0, transmat0, obsmat0, number_of_seq, seq_len);
% initial guess of parameters
prior1 = normalise(rand(N ,1));
transmat1 = mk_stochastic(rand(N ,N ));
obsmat1 = mk_stochastic(rand(N ,M));
% improve guess of parameters using EM
[LL, prior2, transmat2, obsmat2] = dhmm_em(data, prior1, transmat1, obsmat1, 'max_iter', 5);
LL
4.你说的对,下面是你在HMM工具箱中计算对数概率的方法:
% use model to compute log[P(Obs|model)]
loglik = dhmm_logprob(data, prior2, transmat2, obsmat2)
最后:看看Rabiner 的这篇论文,如果有什么不清楚的地方,数学是如何工作的。
希望这可以帮助。