Skip to content

Commit 4363d02

Browse files
committed
implemented fixed_lag_smoothing in probability.py
1 parent 62473f7 commit 4363d02

2 files changed

Lines changed: 68 additions & 11 deletions

File tree

probability.py

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -524,16 +524,15 @@ def markov_blanket_sample(X, e, bn):
524524

525525
# _________________________________________________________________________
526526

527-
# Umbrella Example [Fig. 15.2]
528-
529527

530528
class 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

556555
def 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

564564
def 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

612649
def particle_filtering(e, N, HMM):

tests/test_probability.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,31 @@ def test_forward_backward():
111111

112112
umbrella_evidence = [T, T, F, T, T]
113113
assert forward_backward(umbrellaHMM, umbrella_evidence, umbrella_prior) == [[0.6469, 0.3531],
114-
[0.8673, 0.1327], [0.8204, 0.1796], [0.3075, 0.6925], [0.8204, 0.1796], [0.8673, 0.1327]]
114+
[0.8673, 0.1327], [0.8204, 0.1796], [0.3075, 0.6925], [0.8205, 0.1795], [0.8673, 0.1327]]
115115

116116
umbrella_evidence = [T, F, T, F, T]
117117
assert forward_backward(umbrellaHMM, umbrella_evidence, umbrella_prior) == [[0.5871, 0.4129],
118-
[0.7177, 0.2823], [0.2324, 0.7676], [0.6072, 0.3928], [0.2324, 0.7676], [0.7177, 0.2823]]
118+
[0.7177, 0.2823], [0.2325, 0.7675], [0.6072, 0.3928], [0.2324, 0.7676], [0.7177, 0.2823]]
119+
120+
def test_fixed_lag_smoothing():
121+
umbrella_evidence = [T, F, T, F, T]
122+
e_t = F
123+
t = 4
124+
umbrella_transition = [[0.7, 0.3], [0.3, 0.7]]
125+
umbrella_sensor = [[0.9, 0.2], [0.1, 0.8]]
126+
umbrellaHMM = HiddenMarkovModel(umbrella_transition, umbrella_sensor)
127+
128+
d = 2
129+
assert fixed_lag_smoothing(e_t, umbrellaHMM, d, umbrella_evidence, t) == [0.1111, 0.8889]
130+
d = 5
131+
assert fixed_lag_smoothing(e_t, umbrellaHMM, d, umbrella_evidence, t) is None
132+
133+
umbrella_evidence = [T, T, F, T, T]
134+
# t = 4
135+
e_t = T
136+
137+
d = 1
138+
assert fixed_lag_smoothing(e_t, umbrellaHMM, d, umbrella_evidence, t) == [0.9939, 0.0061]
119139

120140

121141
if __name__ == '__main__':

0 commit comments

Comments
 (0)