Hidden markov model in MATLAB
Asked Answered
S

1

6

I have 11 states, and a transition probability matrix, but I don't have emissions as my model is not hidden. It consists only of states (1,2,3, ..., 11)
I want to generate random states based on my transition probability matrix, but the HMM tool box requires an emission probability matrix. What should I do?

[seq, states] = hmmgenerate(100, Trans, Emis) 
Schaerbeek answered 15/6, 2012 at 17:22 Comment(1)
if you don't have the hidden component of HMM, then its simply a Markov ChainCrookback
C
7

Consider the following:

%# 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)

The sequence of states generated:

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

EDIT:

In fact working with a Markov chain is relatively easy, that we can do it ourselves. Here is another example without using HMM functions from the stats toolbox.

%# 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')

sequence of states

I am using RANDSAMPLE function to sample at each iteration. If you want to use only core functions (no toolboxes), see Weighted random numbers in MATLAB for an alternative.

Crookback answered 15/6, 2012 at 19:8 Comment(7)
Thanks a lot for your helpful answer, I tried it but it is not giving me a satisfaction final result, coz I am applying it on monte carlo simulation and compare the results to something and there's a big error.Schaerbeek
@RadwaMohamed: When you say "error" I have to ask how are you comparing the results? Remember that the sampling here involves randomness so its unlikely you will ever get the same result on two different runs...Crookback
If you are interested, see here for an example application of Markov chains to generate random words (the implementation is very similar to the one I added)Crookback
yes I know that I will not get the same result on two different runs, but if u run this experiment for 2500 times you will get the same average. That's how monte carlo works. So I am comparing the average to the actual results I have. It should be the same. That's what I mean. Thanks a lot for your help.Schaerbeek
@RadwaMohamed: there is no way for us to compare the results unless you share your actual code...Crookback
@RadwaMohamed Do you have observed sequences and you want to compare these to the predictions given by @Amro's code? You might try the Levenshtein distance to compare groups of strings: mathworks.com/matlabcentral/fileexchange/32449-edit-distancesAmnesty
If you are trying to compare different runs of algorithms that include stochasticity fixing the random seed (e.g. rng(1) ) might help.Ehtelehud

© 2022 - 2024 — McMap. All rights reserved.