@@ -524,15 +524,7 @@ def markov_blanket_sample(X, e, bn):
524524
525525# _________________________________________________________________________
526526
527- """
528- umbrella_evidence = [T, T, F, T, T]
529- umbrella_prior = [0.5, 0.5]
530- umbrella_transition = [[0.7, 0.3], [0.3, 0.7]]
531- umbrella_sensor = [[0.9, 0.2], [0.1, 0.8]]
532- umbrellaHMM = HiddenMarkovModel(umbrella_transition, umbrella_sensor)
533-
534- print(forward_backward(umbrellaHMM, umbrella_evidence, umbrella_prior))
535- """
527+ # Umbrella Example [Fig. 15.2]
536528
537529class HiddenMarkovModel :
538530
@@ -568,7 +560,19 @@ def backward(HMM, b, ev):
568560
569561
570562def forward_backward (HMM , ev , prior ):
571- """[Fig. 15.4]"""
563+ """[Fig. 15.4]
564+ Forward-Backward algorithm for smoothing. Computes posterior probabilities
565+ of a sequence of states given a sequence of observations.
566+
567+ umbrella_evidence = [T, T, F, T, T]
568+ umbrella_prior = [0.5, 0.5]
569+ umbrella_transition = [[0.7, 0.3], [0.3, 0.7]]
570+ umbrella_sensor = [[0.9, 0.2], [0.1, 0.8]]
571+ umbrellaHMM = HiddenMarkovModel(umbrella_transition, umbrella_sensor)
572+
573+ >>> forward_backward(umbrellaHMM, umbrella_evidence, umbrella_prior)
574+ [[0.6469, 0.3531], [0.8673, 0.1327], [0.8204, 0.1796], [0.3075, 0.6925], [0.8204, 0.1796], [0.8673, 0.1327]]
575+ """
572576 t = len (ev )
573577 ev .insert (0 , None ) # to make the code look similar to pseudo code
574578
@@ -587,6 +591,7 @@ def forward_backward(HMM, ev, prior):
587591 bv .append (b )
588592
589593 sv = sv [::- 1 ]
594+ # to have only 4 digits after decimal point
590595 for i in range (len (sv )):
591596 for j in range (len (sv [i ])):
592597 sv [i ][j ] = float ("{0:.4f}" .format (sv [i ][j ]))
0 commit comments