我正在使用HMM在MATLAB中进行序列分类任务。我有13个序列及其相应的类。据我所知,hmmestimate()返回一个序列及其类的转换和发射矩阵。但我需要从所有这13个序列计算的最终转换和发射矩阵。我该怎么办?
答案 0 :(得分:1)
一个真诚的,完全无懈可击的建议是写一对for
循环来计算序列中存在的所有过渡和状态发射对,然后对两个结果矩阵中的行进行归一化(过渡这是hmmestimate
最终正在做的事情,这可能是你应该做的。
那就是说,让我们继续前进,然后将方形钉子推入圆孔...
如果将序列连接在一起,则可以通过hmmestimate
运行。这将给出正确的排放矩阵,但相邻序列之间的转换将混淆转移概率。围绕这一点的一个技巧是用新的独特状态和相应的发射来增加每个序列。通过这样做,所有关于连接的信息将被降级为您可以丢弃的输出矩阵的子集。
让我们生成一些数据,因此输入是清晰的。
% true transitions and emission probabilities
tr = [0.9 0.1; 0.05 0.95];
em = [0.9 0.1; 0.2 0.8];
num_seqs = 100;
seq_len = 100;
seqs = zeros(num_seqs,seq_len);
states = zeros(num_seqs,seq_len);
% generate some sequences
for i = 1:num_seqs
[seqs(i,:), states(i,:)] = hmmgenerate(seq_len,tr,em);
end
hmmestimate
估算请注意,MATLAB将其状态表示为连续的整数,因此我们需要将下一个整数用于我们的标记分隔符状态。在示例中,我们使用' 3'。
% augment the sequences
seqs_aug = [3*ones(num_seqs,1) seqs];
states_aug = [3*ones(num_seqs,1) states];
% concatenate the rows, and estimate
% credit: http://stackoverflow.com/a/2731032/570918
[tr_aug,em_aug] = hmmestimate(reshape(seqs_aug.',1,[]),reshape(states_aug.',1,[]));
% subset the good parts
tr_hat = tr_aug(1:2,1:2);
em_hat = em_aug(1:2,1:2);
% renormalize
tr_hat = tr_hat./sum(tr_hat,2);
% NB: em_hat is already normalized
在生成上述数据之前使用rng(1)
,这会给出
tr_hat % [0.9008 0.0992; 0.0490 0.9510]
em_hat % [0.9090 0.0910; 0.1950 0.8050]