Search code examples
simulationlinear-algebrahidden-markov-models

Generating a set of emissions given a transition matrix and starting state in a hidden markov model


I have the transition matrix, emission matrix and starting state for a hidden Markov model. I want to generate a sequence of observations (emissions). However, I'm stuck on one thing.

I understand how to choose among two states (or emissions). If Event A probability x, then Event B (or, really not-A) occurs with probability 1-x. To generate a sequence of A's and B's, with a random number, rand, you do the following.

 for iteration in iterations:
      observation[iteration] <- A if rand < x else B

I don't understand how to extend this to more than two variables. For example, if three events occur such that Event A occurs with probability x1, Event B with x2 and Event C with 1-(x1+x2), then how do I extend the above pseudocode?

I didn't find the answer Googling. In fact I get the impression that I'm missing a basic fact that many of the notes online assume. :-/


Solution

  • One way would be

     x<-rand()
      if x < x1 observation is A
      else if x < x1 + x2 observation is B
      else observation is C
    

    Of course if you have a large number of alternatives it might be better to build a cumulative probability table (holding x1, x1+x2, x1+x2+x3 ...) and then do a binary search in that table given the random number. If you are willing to do more preprocessing, there is an even more efficient way, see here for example