MATLAB中的隐马尔可夫模型

6

我有11个状态和一个转移概率矩阵,但由于我的模型不是隐含的,所以我没有发射值。它只包括状态(1、2、3、...、11)。
我想根据我的转移概率矩阵生成随机状态,但HMM工具箱需要一个发射概率矩阵。我该怎么办?

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

1
如果你没有HMM的隐藏组件,那么它就只是一个马尔可夫链。 - Amro
1个回答

7
请看下面的内容:

考虑以下情况:

%# 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函数在每次迭代中进行抽样。如果你想只使用核心功能(不使用工具箱),请参见MATLAB中加权随机数的替代方法。


非常感谢您的帮助性回答,我尝试了它,但是它没有给我满意的最终结果,因为我正在将其应用于蒙特卡罗模拟,并将结果与某些内容进行比较,但存在很大误差。 - Radwa Mohamed
如果您感兴趣,可以在这里查看使用马尔可夫链生成随机单词的示例应用程序(实现方式与我添加的非常相似)。 - Amro
是的,我知道在两次不同运行中不会得到相同的结果,但如果你运行这个实验2500次,你将得到相同的平均值。这就是蒙特卡洛方法的工作原理。所以我正在将平均值与我拥有的实际结果进行比较。它应该是一样的。这就是我的意思。非常感谢你的帮助。 - Radwa Mohamed
1
@RadwaMohamed:除非你分享你的实际代码,否则我们无法比较结果。 - Amro
如果您正在尝试比较包含随机性的算法的不同运行,固定随机种子(例如 rng(1))可能会有所帮助。 - Chris
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接