我有11个状态和一个转移概率矩阵,但由于我的模型不是隐含的,所以我没有发射值。它只包括状态(1、2、3、...、11)。
我想根据我的转移概率矩阵生成随机状态,但HMM工具箱需要一个发射概率矩阵。我该怎么办?
[seq, states] = hmmgenerate(100, Trans, Emis)
我有11个状态和一个转移概率矩阵,但由于我的模型不是隐含的,所以我没有发射值。它只包括状态(1、2、3、...、11)。
我想根据我的转移概率矩阵生成随机状态,但HMM工具箱需要一个发射概率矩阵。我该怎么办?
[seq, states] = hmmgenerate(100, Trans, Emis)
考虑以下情况:
%# 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中加权随机数的替代方法。