使用HMM对序列进行分类基础帮助

我对Matlab、隐马尔可夫模型和机器学习非常陌生,正在尝试对给定的信号序列进行分类。请告诉我我所采用的方法是否正确:

  1. 创建一个N乘N的转移矩阵,并用随机值填充,每行之和为1。(N将是状态的数量)
  2. 创建一个N乘M的发射/观测矩阵,并用随机值填充,每行之和为1
  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.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" parametersprior0 = 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 6number_of_seq = 5;seq_len= 6;data = dhmm_sample(prior0, transmat0, obsmat0, number_of_seq, seq_len);% initial guess of parametersprior1 = 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的这篇论文,了解数学原理是如何运作的。

希望这对你有帮助。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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