def __init__(self): Pollution = DiscreteDistribution({'F': 0.9, 'T': 0.1}) Smoker = DiscreteDistribution({'T': 0.3, 'F': 0.7}) print(Smoker) Cancer = ConditionalProbabilityTable([ ['T', 'T', 'T', 0.05], ['T', 'T', 'F', 0.95], ['T', 'F', 'T', 0.02], ['T', 'F', 'F', 0.98], ['F', 'T', 'T', 0.03], ['F', 'T', 'F', 0.97], ['F', 'F', 'T', 0.001], ['F', 'F', 'F', 0.999], ], [Pollution, Smoker]) print(Cancer) XRay = ConditionalProbabilityTable([ ['T', 'T', 0.9], ['T', 'F', 0.1], ['F', 'T', 0.2], ['F', 'F', 0.8], ], [Cancer]) Dyspnoea = ConditionalProbabilityTable([ ['T', 'T', 0.65], ['T', 'F', 0.35], ['F', 'T', 0.3], ['F', 'F', 0.7], ], [Cancer]) s1 = Node(Pollution, name="Pollution") s2 = Node(Smoker, name="Smoker") s3 = Node(Cancer, name="Cancer") s4 = Node(XRay, name="XRay") s5 = Node(Dyspnoea, name="Dyspnoea") model = BayesianNetwork("Lung Cancer") model.add_states(s1, s2, s3, s4, s5) model.add_edge(s1, s3) model.add_edge(s2, s3) model.add_edge(s3, s4) model.add_edge(s3, s5) model.bake() self.model = model meta = [] name_mapper = ["Pollution", "Smoker", "Cancer", "XRay", "Dyspnoea"] for i in range(self.model.node_count()): meta.append({ "name": name_mapper[i], "type": "categorical", "size": 2, "i2s": ['T', 'F'] }) self.meta = meta
def __init__(self): A = DiscreteDistribution({'1': 1. / 3, '2': 1. / 3, '3': 1. / 3}) B = ConditionalProbabilityTable([ ['1', '1', 0.5], ['1', '2', 0.5], ['1', '3', 0], ['2', '1', 0], ['2', '2', 0.5], ['2', '3', 0.5], ['3', '1', 0.5], ['3', '2', 0], ['3', '3', 0.5], ], [A]) C = ConditionalProbabilityTable([ ['1', '4', 0.5], ['1', '5', 0.5], ['1', '6', 0], ['2', '4', 0], ['2', '5', 0.5], ['2', '6', 0.5], ['3', '4', 0.5], ['3', '5', 0], ['3', '6', 0.5], ], [A]) s1 = Node(A, name="A") s2 = Node(B, name="B") s3 = Node(C, name="C") model = BayesianNetwork("tree") model.add_states(s1, s2, s3) model.add_edge(s1, s2) model.add_edge(s1, s3) model.bake() self.model = model meta = [] for i in range(self.model.node_count() - 1): meta.append({ "name": chr(ord('A') + i), "type": "categorical", "size": 3, "i2s": ['1', '2', '3'] }) meta.append({ "name": "C", "type": "categorical", "size": 3, "i2s": ['4', '5', '6'] }) self.meta = meta
def __init__(self): Rain = DiscreteDistribution({'T': 0.2, 'F': 0.8}) Sprinkler = ConditionalProbabilityTable([ ['F', 'T', 0.4], ['F', 'F', 0.6], ['T', 'T', 0.1], ['T', 'F', 0.9], ], [Rain]) Wet = ConditionalProbabilityTable([ ['F', 'F', 'T', 0.01], ['F', 'F', 'F', 0.99], ['F', 'T', 'T', 0.8], ['F', 'T', 'F', 0.2], ['T', 'F', 'T', 0.9], ['T', 'F', 'F', 0.1], ['T', 'T', 'T', 0.99], ['T', 'T', 'F', 0.01], ], [Sprinkler, Rain]) s1 = Node(Rain, name="Rain") s2 = Node(Sprinkler, name="Sprinkler") s3 = Node(Wet, name="Wet") model = BayesianNetwork("Simple fully connected") model.add_states(s1, s2, s3) model.add_edge(s1, s2) model.add_edge(s1, s3) model.add_edge(s2, s3) model.bake() self.model = model meta = [] for i in range(self.model.node_count()): meta.append({ "name": None, "type": "categorical", "size": 2, "i2s": ['T', 'F'] }) meta[0]['name'] = 'Rain' meta[1]['name'] = 'Sprinkler' meta[2]['name'] = 'Wet' self.meta = meta
def __get_symptom_distributions_and_states(self, known_symptoms: List): symptom_distributions = list() symptom_states = list() for ( symptom, probability, not_symptom, not_probability, ) in known_symptoms: symptom_distribution = DiscreteDistribution({ "1": float(probability), "0": float(not_probability) }) symptom_distributions.append(symptom_distribution) symptom_states.append((Node(symptom_distribution, name=symptom))) return symptom_distributions, symptom_states
def test_io_fit(): d1 = DiscreteDistribution({True: 0.6, False: 0.4}) d2 = ConditionalProbabilityTable([ [True, 'A', 0.2], [True, 'B', 0.8], [False, 'A', 0.3], [False, 'B', 0.7]], [d1]) d3 = ConditionalProbabilityTable([ ['A', 0, 0.3], ['A', 1, 0.7], ['B', 0, 0.8], ['B', 1, 0.2]], [d2]) n1 = Node(d1) n2 = Node(d2) n3 = Node(d3) model1 = BayesianNetwork() model1.add_nodes(n1, n2, n3) model1.add_edge(n1, n2) model1.add_edge(n2, n3) model1.bake() model1.fit(X, weights=weights) d1 = DiscreteDistribution({True: 0.2, False: 0.8}) d2 = ConditionalProbabilityTable([ [True, 'A', 0.7], [True, 'B', 0.2], [False, 'A', 0.4], [False, 'B', 0.6]], [d1]) d3 = ConditionalProbabilityTable([ ['A', 0, 0.9], ['A', 1, 0.1], ['B', 0, 0.0], ['B', 1, 1.0]], [d2]) n1 = Node(d1) n2 = Node(d2) n3 = Node(d3) model2 = BayesianNetwork() model2.add_nodes(n1, n2, n3) model2.add_edge(n1, n2) model2.add_edge(n2, n3) model2.bake() model2.fit(data_generator) logp1 = model1.log_probability(X) logp2 = model2.log_probability(X) assert_array_almost_equal(logp1, logp2)
def __get_bayesian_network_model( self, symptom_distributions: List, symptom_states: List, file_name: str, disease_name: str, ): disease_conditional_distribution = list() for (s1, s2, s3, s4, s5, d, p) in get_from_csv(file_name): disease_conditional_distribution.append( [s1, s2, s3, s4, s5, d, float(p)]) disease_distribution = ConditionalProbabilityTable( disease_conditional_distribution, symptom_distributions, ) disease = Node(disease_distribution, name=disease_name) model = BayesianNetwork(disease_name) model.add_state(disease) for symptom_state in symptom_states: model.add_state(symptom_state) model.add_edge(symptom_state, disease) model.bake() return model
from pomegranate import DiscreteDistribution from pomegranate import ConditionalProbabilityTable from pomegranate import BayesianNetwork from pomegranate import Node guest = DiscreteDistribution({'A': 1. / 3, 'B': 1. / 3, 'C': 1. / 3}) prize = DiscreteDistribution({'A': 1. / 3, 'B': 1. / 3, 'C': 1. / 3}) monty = ConditionalProbabilityTable( [['A', 'A', 'A', 0.0], ['A', 'A', 'B', 0.5], ['A', 'A', 'C', 0.5], ['A', 'B', 'A', 0.0], ['A', 'B', 'B', 0.0], ['A', 'B', 'C', 1.0], ['A', 'C', 'A', 0.0], ['A', 'C', 'B', 1.0], ['A', 'C', 'C', 0.0], ['B', 'A', 'A', 0.0], ['B', 'A', 'B', 0.0], ['B', 'A', 'C', 1.0], ['B', 'B', 'A', 0.5], ['B', 'B', 'B', 0.0], ['B', 'B', 'C', 0.5], ['B', 'C', 'A', 1.0], ['B', 'C', 'B', 0.0], ['B', 'C', 'C', 0.0], ['C', 'A', 'A', 0.0], ['C', 'A', 'B', 1.0], ['C', 'A', 'C', 0.0], ['C', 'B', 'A', 1.0], ['C', 'B', 'B', 0.0], ['C', 'B', 'C', 0.0], ['C', 'C', 'A', 0.5], ['C', 'C', 'B', 0.5], ['C', 'C', 'C', 0.0]], [guest, prize]) s1 = Node(guest, name="guest") s2 = Node(prize, name="prize") s3 = Node(monty, name="monty") model = BayesianNetwork("Monty Hall Problem") model.add_states(s1, s2, s3) model.add_edge(s1, s3) model.add_edge(s2, s3) model.bake()
def __init__(self, filename): with open(filename) as f: bif = f.read() vars = re.findall(r"variable[^\{]+{[^\}]+}", bif) probs = re.findall(r"probability[^\{]+{[^\}]+}", bif) var_nodes = {} var_index_to_name = [] edges = [] self.meta = [] todo = set() for v, p in zip(vars, probs): m = re.search(r"variable\s+([^\{\s]+)\s+", v) v_name = m.group(1) m = re.search(r"type\s+discrete\s+\[\s*(\d+)\s*\]\s*\{([^\}]+)\}", v) v_opts_n = int(m.group(1)) v_opts = m.group(2).replace(',', ' ').split() assert v_opts_n == len(v_opts) # print(v_name, v_opts_n, v_opts) m = re.search(r"probability\s*\(([^)]+)\)", p) cond = m.group(1).replace('|', ' ').replace(',', ' ').split() assert cond[0] == v_name # print(cond) self.meta.append({ "name": v_name, "type": "categorical", "size": v_opts_n, "i2s": v_opts }) if len(cond) == 1: m = re.search(r"table([e\-\d\.\s,]*);", p) margin_p = m.group(1).replace(',', ' ').split() margin_p = [float(x) for x in margin_p] assert abs(sum(margin_p) - 1) < 1e-6 assert len(margin_p) == v_opts_n margin_p = dict(zip(v_opts, margin_p)) var_index_to_name.append(v_name) tmp = DiscreteDistribution(margin_p) # print(tmp) var_nodes[v_name] = tmp else: m_iter = re.finditer(r"\(([^)]*)\)([\s\d\.,\-e]+);", p) cond_p_table = [] for m in m_iter: cond_values = m.group(1).replace(',', ' ').split() cond_p = m.group(2).replace(',', ' ').split() cond_p = [float(x) for x in cond_p] assert len(cond_values) == len(cond) - 1 assert len(cond_p) == v_opts_n assert abs(sum(cond_p) - 1) < 1e-6 for opt, opt_p in zip(v_opts, cond_p): cond_p_table.append(cond_values + [opt, opt_p]) var_index_to_name.append(v_name) tmp = (cond_p_table, cond) # print(tmp) var_nodes[v_name] = tmp for x in cond[1:]: edges.append((x, v_name)) todo.add(v_name) while len(todo) > 0: # print(todo) for v_name in todo: # print(v_name, type(var_nodes[v_name])) cond_p_table, cond = var_nodes[v_name] flag = True for y in cond[1:]: if y in todo: flag = False break if flag: cond_t = [var_nodes[x] for x in cond[1:]] var_nodes[v_name] = ConditionalProbabilityTable( cond_p_table, cond_t) todo.remove(v_name) break for x in var_index_to_name: var_nodes[x] = Node(var_nodes[x], name=x) var_nodes_list = [var_nodes[x] for x in var_index_to_name] # print(var_nodes_list) model = BayesianNetwork("tmp") model.add_states(*var_nodes_list) for edge in edges: model.add_edge(var_nodes[edge[0]], var_nodes[edge[1]]) model.bake() # print(model.to_json()) self.model = model
lung_cancer = ConditionalProbabilityTable( buildCpt("Lung_cancer", ["Smoking", "Genetics"]), [smoking, genetics]) yellow_fingers = ConditionalProbabilityTable( buildCpt("Yellow_Fingers", ["Smoking"]), [smoking]) attention_disorder = ConditionalProbabilityTable( buildCpt("Attention_Disorder", ["Genetics"]), [genetics]) coughing = ConditionalProbabilityTable( buildCpt("Coughing", ["Allergy", "Lung_cancer"]), [allergy, lung_cancer]) fatigue = ConditionalProbabilityTable( buildCpt("Fatigue", ["Lung_cancer", "Coughing"]), [lung_cancer, coughing]) car_accident = ConditionalProbabilityTable( buildCpt("Car_Accident", ["Fatigue", "Attention_Disorder"]), [fatigue, attention_disorder], ) sAnxiety = Node(anxiety, name="Anxiety") sPeerPressure = Node(peer_pressure, name="Peer_Pressure") sSmoking = Node(smoking, name="Smoking") sGenetics = Node(genetics, name="Genetics") sLungCancer = Node(lung_cancer, name="Lung_cancer") sYellowFingers = Node(yellow_fingers, name="Yellow_Fingers") sAttentionDisorder = Node(attention_disorder, name="Attention_Disorder") sCoughing = Node(coughing, name="Coughing") sFatigue = Node(fatigue, name="Fatigue") sCarAccident = Node(car_accident, name="Car_Accident") sAllergy = Node(allergy, name="Allergy") model = BayesianNetwork("Smoking Risk") model.add_nodes( sAnxiety, sPeerPressure,
from pomegranate import DiscreteDistribution from pomegranate import ConditionalProbabilityTable from pomegranate import BayesianNetwork from pomegranate import Node # Rain node has no parents rain = Node(DiscreteDistribution({ "none": 0.7, "light": 0.2, "heavy": 0.1 }), name="rain") # Track maintenance node is coditional on rain maintenance = Node(ConditionalProbabilityTable( [["none", "yes", 0.4], ["none", "no", 0.6], ["light", "yes", 0.2], ["light", "no", 0.8], ["heavy", "yes", 0.1], ["heavy", "no", 0.9]], [rain.distribution]), name="maintenance") # Train Node is conditional on rain, and maintenance train = Node(ConditionalProbabilityTable([ ["none", "yes", "on time", 0.8], ["none", "yes", "delayed", 0.2], ["none", "no", "on time", 0.9], ["none", "no", "delayed", 0.1], ["light", "yes", "on time", 0.6], ["light", "yes", "delayed", 0.4], ["light", "no", "on time", 0.7], ["light", "no", "delayed", 0.3], ["heavy", "yes", "on time", 0.4],