@@ -524,16 +524,15 @@ def markov_blanket_sample(X, e, bn):
524524
525525# _________________________________________________________________________
526526
527- # Umbrella Example [Fig. 15.2]
528-
529527
530528class HiddenMarkovModel :
531529
532530 """ A Hidden markov model which takes Transition model and Sensor model as inputs"""
533531
534- def __init__ (self , transition_model , sensor_model ):
532+ def __init__ (self , transition_model , sensor_model , prior = [ 0.5 , 0.5 ] ):
535533 self .transition_model = transition_model
536534 self .sensor_model = sensor_model
535+ self .prior = prior
537536
538537 def transition_model (self ):
539538 return self .transition_model
@@ -550,15 +549,16 @@ def forward(HMM, fv, ev):
550549 scalar_vector_product (fv [1 ], HMM .transition_model [1 ]))
551550 sensor_dist = HMM .sensor_dist (ev )
552551
553- return (normalize (element_wise_product (sensor_dist , prediction )))
552+ return ([ float ( "{0:.4f}" . format ( i )) for i in normalize (element_wise_product (sensor_dist , prediction ))] )
554553
555554
556555def backward (HMM , b , ev ):
557556 sensor_dist = HMM .sensor_dist (ev )
558557 prediction = element_wise_product (sensor_dist , b )
559558
560- return (normalize (vector_add (scalar_vector_product (prediction [0 ], HMM .transition_model [0 ]),
561- scalar_vector_product (prediction [1 ], HMM .transition_model [1 ]))))
559+ return ([float ("{0:.4f}" .format (i )) for i in normalize (vector_add (
560+ scalar_vector_product (prediction [0 ], HMM .transition_model [0 ]),
561+ scalar_vector_product (prediction [1 ], HMM .transition_model [1 ])))])
562562
563563
564564def forward_backward (HMM , ev , prior ):
@@ -604,9 +604,46 @@ def forward_backward(HMM, ev, prior):
604604# _________________________________________________________________________
605605
606606
607- def fixed_lag_smoothing (e_t , hmm , d ):
608- """[Fig. 15.6]"""
609- unimplemented ()
607+ def fixed_lag_smoothing (e_t , HMM , d , ev , t ):
608+ """[Fig. 15.6]
609+ Smoothing algorithm with a fixed time lag of 'd' steps.
610+ Online algorithm that outputs the new smoothed estimate if observation
611+ for new time step is given.
612+
613+ umbrella_evidence = [T, T, F, T, T]
614+ e_t = T
615+ t = 4
616+ d = 3
617+ umbrella_transition = [[0.7, 0.3], [0.3, 0.7]]
618+ umbrella_sensor = [[0.9, 0.2], [0.1, 0.8]]
619+ umbrellaHMM = HiddenMarkovModel(umbrella_transition, umbrella_sensor)
620+
621+ >>> fixed_lag_smoothing(T, umbrellaHMM, d)
622+ """
623+ ev .insert (0 , None )
624+
625+ T_model = HMM .transition_model
626+ f = HMM .prior
627+ B = [[1 , 0 ], [0 , 1 ]]
628+ evidence = []
629+
630+ evidence .append (e_t )
631+ O_t = vector_to_diagonal (HMM .sensor_dist (e_t ))
632+ if t > d :
633+ f = forward (HMM , f , e_t )
634+ O_tmd = vector_to_diagonal (HMM .sensor_dist (ev [t - d ]))
635+ B = matrix_multiplication (inverse_matrix (O_tmd ), inverse_matrix (T_model ), B , T_model , O_t )
636+ else :
637+ B = matrix_multiplication (B , T_model , O_t )
638+ t = t + 1
639+
640+ if t > d :
641+ # always returns a 1x2 matrix
642+ return ([normalize (i ) for i in matrix_multiplication ([f ], B )][0 ])
643+ else :
644+ return None
645+
646+ # _________________________________________________________________________
610647
611648
612649def particle_filtering (e , N , HMM ):
0 commit comments