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) 
Amro
  • 123,847
  • 25
  • 243
  • 454
Radwa Mohamed
  • 61
  • 1
  • 1
  • 2
  • 1
    if you don't have the hidden component of HMM, then its simply a [Markov Chain](http://en.wikipedia.org/wiki/Markov_chain) – Amro Jun 15 '12 at 18:55

1 Answers1

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.

Community
  • 1
  • 1
Amro
  • 123,847
  • 25
  • 243
  • 454
  • 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. – Radwa Mohamed Jun 15 '12 at 23:08
  • @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... – Amro Jun 15 '12 at 23:26
  • If you are interested, see [here](http://stackoverflow.com/a/3341080/97160) for an example application of Markov chains to generate random words (the implementation is very similar to the one I added) – Amro Jun 15 '12 at 23:47
  • 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. – Radwa Mohamed Jun 16 '12 at 20:18
  • 1
    @RadwaMohamed: there is no way for us to compare the results unless you share your actual code... – Amro Jun 16 '12 at 20:57
  • @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: http://www.mathworks.com/matlabcentral/fileexchange/32449-edit-distances – HCAI Sep 17 '12 at 21:24
  • If you are trying to compare different runs of algorithms that include stochasticity fixing the random seed (e.g. rng(1) ) might help. – Chris Nov 17 '13 at 21:46