gpt4 book ai didi

matlab - 如何在 MATLAB 中从 HMM 的多个序列中获取转换和发射矩阵?

转载 作者:太空宇宙 更新时间:2023-11-03 19:47:31 24 4
gpt4 key购买 nike

我正在使用 HMM 在 MATLAB 中执行序列分类任务。我有 13 个序列及其对应的类。据我所知, hmmestimate() 返回一个序列及其类的转换和发射矩阵。但我需要从所有这 13 个序列计算出的最终转换和发射矩阵。我该怎么做?

最佳答案

应该做什么...

一个真诚的、完全没有 snark-free 的建议是编写几个 for 循环来计算序列中存在的所有转换和状态发射对,然后将两个结果中的行归一化矩阵(转换和发射),以便它们加起来为 1。这就是 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]

关于matlab - 如何在 MATLAB 中从 HMM 的多个序列中获取转换和发射矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28788861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com