使用hmm对序列进行分类的基本帮助

时间:2013-10-10 18:29:05

标签: matlab machine-learning classification hidden-markov-models

我是matlab,隐藏马尔可夫模型和机器学习的新手,我正在尝试对给定的信号序列进行分类。如果我所遵循的方法是正确的,请告诉我:

  1. 创建N×N转换矩阵并填充随机值,每行的总和为1。 (N将是州的数量)
  2. 创建一个N×M发射/观测矩阵,并填充随机值,每行总和为
  3. 将序列的不同实例(即每个实例将单词'hello')转换为一个长流并将每个流馈送到hmm列车函数,以便:

    new_transition_matrix old_transition_matrix = hmmtrain(sequence,old_transition_matrix,old_emission_matrix)

  4. 将最终的过渡和发射矩阵用于具有未知序列的hmm解码以给出概率 即[posterior_states logrithmic_probability] = hmmdecode( sequence, final_transition_matrix,final_emission_matris)

1 个答案:

答案 0 :(得分:3)

1。 2。是正确的。你必须要小心你的初始转换和发射矩阵不是完全一致的,它们应该稍微随机化以使training起作用。

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 toolbox。它有一个关于如何训练具有多个观察序列的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)

最后:如果有任何不清楚的地方,请看看paper by Rabiner数学如何运作。

希望这有帮助。