The Infinite Hidden Markov model (also known as HDP-HMM) has a potentially infinite number of latent states:
(define vocabulary '(chef omelet soup eat work bake))
(define (get-state) (DPmem 0.5 gensym))
(define state->transition-model
(mem
(lambda (state)
(DPmem 1.0 (get-state)))))
(define (transition state)
(sample (state->transition-model state)))
(define state->observation-model
(mem
(lambda (state)
(dirichlet (make-list (length vocabulary) 1)))))
(define (observation state)
(multinomial vocabulary (state->observation-model state)))
(define (sample-words last-state)
(if (flip 0.2)
'()
(pair (observation last-state)
(sample-words (transition last-state)))))
(sample-words 'start)
Compare to a version using unfold
:
(define vocabulary '(chef omelet soup eat work bake))
(define (get-state)
(DPmem 0.5 gensym))
(define state->transition-model
(mem
(lambda (state)
(DPmem 1.0 (get-state)))))
(define (transition state)
(if (flip .2)
'stop
(state->transition-model state)))
(define state->observation-model
(mem
(lambda (state)
(dirichlet (make-list (length vocabulary) 1)))))
(define (observation state)
(multinomial vocabulary (state->observation-model state)))
(define (unfold p f g seed)
(if (p seed)
'()
(pair (f seed)
(unfold p f g (g seed)))))
(define (stop? state)
(eq? state 'stop))
(define (sample-ihmm)
(unfold stop? observation transition 'S))
(sample-ihmm)
See also:
References: