[EMAIL PROTECTED] wrote:
> I think is more easy explained as two linked markov chains. So given
> one list the other can be generated.

'Given one list sounds' like an observation (and this sound like an 
order 2 hmm).
But I'm not sure what exactly you want to do with your markov chain. Do 
you want the probability distribution at each time step or some value ?
In this case, I'd do something like:

#### hmm.py
from random import random

def St_given_St1_St2_Ot(St1,St2,Ot):
        p0=0.5*St1*St2+0.25*St1+0.125*St2+0.0625
        return Ot and p0 or 1-p0

def decision(p):
        return (random()>p) and 1 or 0

def hmm(LO,LS):
        for ot in LO[2:]:
                p=St_given_St1_St2_Ot(LS[-1],LS[-2],ot)
                LS.append(decision(p))
        return LS

LO1=(-1,-1,1,0,0,0,1,1)
LS1=[1,0]
print ''.join(map(str,hmm(LO1,LS1)))

LO2=(0,)*50
LS2=[1,1]
print ''.join(map(str,hmm(LO2,LS2)))

LO3=(1,)*50
LS3=[1,1]
print ''.join(map(str,hmm(LO3,LS3)))
####


Which gives hours of fun looking at random numbers:

$ python hmm.py
10111101
11111111111111111111111111100000000000001000000000
11011011011011011011010110011011011011011010101101
$ python hmm.py
10101011
11111111111111111111111111111111000000000000000111
11011010011010100011010110110011001101101101011010
$ python hmm.py
10100011
11111111111111111111111111111111111111111111111111
11011010110011001101011011011101010110101101101011
$ python hmm.py
10111101
11101010000000000000000000000000000000000000000001
11011001101101011010110111010101010110110110011101
$ python hmm.py
10100011
11111111111111111111111111111111111111111111111111
11010110110110110011011010110011010011011011011010
$


Instead of generating the whole sequence, you can wrap it in an 
iterator. And the observations list can also be an iterator (generated 
with another chain if you like).

HTH
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to