def marginal_ve_e(bn, target, evidence={}): """ Perform Sum-Product Variable Elimination on a Discrete Bayesian Network. Arguments --------- *bn* : a BayesNet object *target* : a list of target RVs *evidence* : a dictionary, where key = rv and value = rv value Returns ------- *marginal_dict* : a dictionary, where key = an rv in target and value = a numpy array containing the key's marginal conditional probability distribution. Notes ----- - Mutliple pieces of evidence often returns "nan"...numbers too small? - dividing by zero -> perturb values in Factor class """ _phi = Factorization(bn) order = copy(list(bn.nodes())) order.remove(target) #### EVIDENCE PROCESSING #### for E, e in evidence.items(): _phi -= (E, e) order.remove(E) #### SUM-PRODUCT ELIMINATE VAR #### for var in order: _phi /= var # multiply phi's together if there is evidence final_phi = _phi.consolidate() return np.round(final_phi.cpt, 4)
def marginal_ve_e(bn, target, evidence={}): """ Perform Sum-Product Variable Elimination on a Discrete Bayesian Network. Arguments --------- *bn* : a BayesNet object *target* : a list of target RVs *evidence* : a dictionary, where key = rv and value = rv value Returns ------- *marginal_dict* : a dictionary, where key = an rv in target and value = a numpy array containing the key's marginal conditional probability distribution. Notes ----- - Mutliple pieces of evidence often returns "nan"...numbers too small? - dividing by zero -> perturb values in Factor class """ _phi = Factorization(bn) order = copy(list(bn.nodes())) order.remove(target) #### EVIDENCE PROCESSING #### for E, e in evidence.items(): _phi -= (E,e) order.remove(E) #### SUM-PRODUCT ELIMINATE VAR #### for var in order: _phi /= var # multiply phi's together if there is evidence final_phi = _phi.consolidate() return np.round(final_phi.cpt,4)
def ve_map(bn, evidence={}, target=None, prob=False): """ Perform Max-Sum Variable Elimination over a BayesNet object for exact maximum a posteriori inference. This has been validated w/ and w/out evidence """ _phi = Factorization(bn) order = copy(list(bn.nodes())) #### EVIDENCE PROCESSING #### for E, e in evidence.items(): _phi -= (E,e) order.remove(E) #### MAX-PRODUCT ELIMINATE VAR #### for var in order: _phi //= var #### TRACEBACK MAP ASSIGNMENT #### max_assignment = _phi.traceback_map() #### RETURN #### if prob: # multiply phi's together if there is evidence final_phi = _phi.consolidate() max_prob = round(final_phi.cpt[0],5) if target is not None: return max_prob, max_assignment[target] else: return max_prob, max_assignment else: if target is not None: return max_assignment[target] else: return max_assignment
def ve_map(bn, evidence={}, target=None, prob=False): """ Perform Max-Sum Variable Elimination over a BayesNet object for exact maximum a posteriori inference. This has been validated w/ and w/out evidence """ _phi = Factorization(bn) order = copy(list(bn.nodes())) #### EVIDENCE PROCESSING #### for E, e in evidence.items(): _phi -= (E, e) order.remove(E) #### MAX-PRODUCT ELIMINATE VAR #### for var in order: _phi //= var #### TRACEBACK MAP ASSIGNMENT #### max_assignment = _phi.traceback_map() #### RETURN #### if prob: # multiply phi's together if there is evidence final_phi = _phi.consolidate() max_prob = round(final_phi.cpt[0], 5) if target is not None: return max_prob, max_assignment[target] else: return max_prob, max_assignment else: if target is not None: return max_assignment[target] else: return max_assignment