Reasoning under uncertainty: Bayes' rule
Logic gives true or false answers, but real knowledge is often uncertain: tests are imperfect and sensors are noisy. Probability theory provides a principled way to represent degrees of belief and to update them. Bayes' rule says P(H | E) = P(E | H) · P(H) / P(E): the posterior belief in a hypothesis H after evidence E depends on the prior P(H) and the likelihood of the evidence if H is true.
Python
def posterior(prior, sensitivity, false_positive):
evidence = sensitivity * prior + false_positive * (1 - prior)
return sensitivity * prior / evidence
print(round(posterior(0.01, 0.9, 0.09), 4), round(posterior(0.10, 0.9, 0.09), 4))
P_RAIN = 0.2
P_SPRINKLER = {True: 0.01, False: 0.4}
P_WET = {(True, True): 0.99, (True, False): 0.9, (False, True): 0.8, (False, False): 0.0}
def joint(rain, sprinkler, wet):
p = P_RAIN if rain else 1 - P_RAIN
p *= P_SPRINKLER[rain] if sprinkler else 1 - P_SPRINKLER[rain]
p_wet = P_WET[(sprinkler, rain)]
return p * (p_wet if wet else 1 - p_wet)
numerator = sum(joint(True, s, True) for s in (True, False))
evidence = sum(joint(r, s, True) for r in (True, False) for s in (True, False))
print(round(numerator / evidence, 4), round(evidence, 4))