【问题标题】:Hidden markov model in MATLABMATLAB中的隐马尔可夫模型
【发布时间】:2012-06-18 19:16:39
【问题描述】:

我有 11 个状态和一个转移概率矩阵,但我没有排放,因为我的模型没有隐藏。它仅包含状态 (1,2,3, ..., 11)
我想根据我的转移概率矩阵生成随机状态,但是 HMM 工具箱需要一个发射概率矩阵。我该怎么办?

[seq, states] = hmmgenerate(100, Trans, Emis) 

【问题讨论】:

  • 如果你没有 HMM 的隐藏组件,那么它只是一个 Markov Chain

标签: matlab markov-chains hidden-markov-models


【解决方案1】:

考虑以下几点:

%# number of states
N = 11;

%# some random transition matrix
trans = rand(N,N);
trans = bsxfun(@rdivide, trans, sum(trans,2));

%# fake emission matrix (only one symbol)
emis = ones(N,1);

%# get a sample of length = 10
[~,states] = hmmgenerate(10, trans, emis)

产生的状态序列:

>> states
states =
    10     1     3    11     9     4    11     1     4     6

编辑:

事实上,使用马尔可夫链相对容易,我们可以自己完成。这是另一个没有使用统计工具箱中的 HMM 函数的示例。

%# number of states
N = 3;

%# transition matrix
trans = rand(N,N);
trans = bsxfun(@rdivide, trans, sum(trans,2));

%# probability of being in state i at time t=0
prior = rand(1,N);
prior = prior ./ sum(prior);

%# generate a sequence of states
len = 100;          %# length of sequence
states = zeros(1,len);
states(1) = randsample(N, 1, true, prior);
for t=2:len
    states(t) = randsample(N, 1, true, trans(states(t-1),:));
end

%# show sequence
stairs(states, 'LineWidth',2)
set(gca, 'YGrid','on', 'YLim',[0 N+1])
xlabel('time'), ylabel('states')
title('sequence of states')

我使用 RANDSAMPLE 函数在每次迭代时进行采样。如果您只想使用核心功能(没有工具箱),请参阅Weighted random numbers in MATLAB 了解替代方案。

【讨论】:

  • 非常感谢您的有用回答,我试过了,但它并没有给我一个满意的最终结果,因为我将它应用于蒙特卡洛模拟并将结果与​​某些东西进行比较,并且有一个很大的错误.
  • @RadwaMohamed:当您说“错误”时,我不得不问您如何比较结果?请记住,这里的采样涉及随机性,因此您不太可能在两次不同的运行中得到相同的结果...
  • 有兴趣的可以看here马尔可夫链生成随机词的示例应用(实现和我加的很相似)
  • 是的,我知道在两次不同的运行中我不会得到相同的结果,但是如果你运行这个实验 2500 次你会得到相同的平均值。蒙特卡洛就是这样运作的。所以我将平均值与我的实际结果进行比较。应该是一样的。那就是我的意思。非常感谢您的帮助。
  • @RadwaMohamed:除非您分享您的实际代码,否则我们无法比较结果...
猜你喜欢
  • 2012-08-15
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
相关资源
最近更新 更多