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

Posted

技术标签:

【中文标题】使用 hmm 对序列进行分类的基本帮助【英文标题】:basic help using hmm to clasify a sequence 【发布时间】:2013-10-18 16:00:03 【问题描述】:

我对 matlab、隐马尔可夫模型和机器学习非常陌生,并且正在尝试对给定的信号序列进行分类。请让我知道我遵循的方法是否正确:

    创建一个 N × N 转换矩阵,并填充每行总和为 1 的随机值。 (N 将是状态数) 创建一个 N x M 发射/观察矩阵,并填充每行总和为 1 的随机值

    将序列的不同实例(即每个实例都会说单词 'hello' )转换为一个长流并将每个流馈送到 hmm train 函数,这样:

    new_transition_matrix old_transition_matrix = hmmtrain(sequence,old_transition_matrix,old_emission_matrix)

    给出最终的转换和发射矩阵,以用未知序列进行 hmm 解码,以给出概率 即[posterior_states logrithmic_probability] = hmmdecode( sequence, final_transition_matrix,final_emission_matris)

【问题讨论】:

你做到了吗,我还需要有关 HMM 的帮助。你用过哪个工具箱? 就像下面的答案一样,我使用了 Murphys 工具箱,但使用了带有高斯输出的 HMM。你可以在这里看到教程cs.ubc.ca/~murphyk/Software/HMM/hmm_usage.html 我见过这个,我对 HMM 有一些疑问,HMM 是否会在神经网络中生成像 .xml 这样的训练文件?我想用 HMM 训练轨迹,具有 X、Y、Z 坐标,什么是序列,因为我认为我的状态是每一个新的状态变化行。 【参考方案1】:

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,如果有不清楚的地方,数学是如何工作的。

希望这会有所帮助。

【讨论】:

你能告诉我prior0到底是什么吗?并感谢您的回答。真的很感激。 您的情况实际上不需要它。 prior0transmat0obsmat0 用于数据生成步骤。它们代表真实模型(由机器学习器生成),因此在训练系统后,实验者可以将学习到的参数 prior2transmat2obsmat2 与实际创建数据的参数进行比较。 prior0 具体给出了系统在一开始就处于某种状态的概率,例如'模型是从 state1 还是 state2 开始的?' 非常感谢。但是我现在正在查看“具有混合高斯输出的 HMM”,因为我需要矢量,但我无法理解这一行“现在让我们使用 M=2 高斯的混合”。 M究竟代表什么?我现在正在学习高斯,但我不知道 M 做了什么。 在典型的 MoG 应用程序中,样本数据被认为来自各种可能的来源(在您的情况下为 M),并且来自每个特定来源的数据由高斯建模。谷歌和***应该在这方面提供很大帮助。例如这个link. @Zhubarb 我在hmmtrain 或 HMM 的训练过程中有点困惑,但是我想知道是否有一些 .xml 生成用于跟踪过去记录或在运行时生成概率,当专门使用 EM 培训?

以上是关于使用 hmm 对序列进行分类的基本帮助的主要内容,如果未能解决你的问题,请参考以下文章

用于 SVM-HMM 或其他基于顺序的分类器的 JAVA 库

序列标注(HMM/CRF)

在 Weka 中使用 HMM

MATLAB中HMM函数SEQ(观察序列的值)必须是正整数吗

从HMM到RNN,机器学习中的时间序列模型

使用(?) LSTM 进行多变量时间序列分类