def setUp(self): edges = [['family-out', 'dog-out'], ['bowel-problem', 'dog-out'], ['family-out', 'light-on'], ['dog-out', 'hear-bark']] cpds = { 'bowel-problem': np.array([[0.01], [0.99]]), 'dog-out': np.array([[0.99, 0.01, 0.97, 0.03], [0.9, 0.1, 0.3, 0.7]]), 'family-out': np.array([[0.15], [0.85]]), 'hear-bark': np.array([[0.7, 0.3], [0.01, 0.99]]), 'light-on': np.array([[0.6, 0.4], [0.05, 0.95]]) } states = { 'bowel-problem': ['true', 'false'], 'dog-out': ['true', 'false'], 'family-out': ['true', 'false'], 'hear-bark': ['true', 'false'], 'light-on': ['true', 'false'] } parents = { 'bowel-problem': [], 'dog-out': ['family-out', 'bowel-problem'], 'family-out': [], 'hear-bark': ['dog-out'], 'light-on': ['family-out'] } properties = { 'bowel-problem': ['position = (335, 99)'], 'dog-out': ['position = (300, 195)'], 'family-out': ['position = (257, 99)'], 'hear-bark': ['position = (296, 268)'], 'light-on': ['position = (218, 195)'] } self.model = BayesianModel(edges) tabular_cpds = [] for var in sorted(cpds.keys()): values = cpds[var] cpd = TabularCPD(var, len(states[var]), values, evidence=parents[var], evidence_card=[ len(states[evidence_var]) for evidence_var in parents[var] ]) tabular_cpds.append(cpd) self.model.add_cpds(*tabular_cpds) for node, properties in properties.items(): for prop in properties: prop_name, prop_value = map(lambda t: t.strip(), prop.split('=')) self.model.node[node][prop_name] = prop_value self.writer = BIFWriter(model=self.model)
def create_BN_model(data): #structure learning print("Structure learning") start_time = datetime.now() print("Start time: ", start_time) #DECOMMENT TO CREATE A MODEL WITH THE HILL CLIMB ALGORITHM hc = HillClimbSearch(data) best_model = hc.estimate() print(best_model.edges()) edges = best_model.edges() model = BayesianModel(edges) print('Fitting the model...') # Evaluation of cpds using Maximum Likelihood Estimation model.fit(data) end_time = datetime.now() print("End time: ", end_time) model_write = BIFWriter(model) model_write.write_bif('model_pgmpy.bif') if model.check_model(): print( "Your network structure and CPD's are correctly defined. The probabilities in the columns sum to 1. Hill Climb worked fine!" ) else: print("not good") return (model, end_time - start_time)
def saveModel(model: BayesianModel, file_name: str) -> bool: """ A function used to save the given model to BIF file format. """ from pgmpy.readwrite import BIFReader, BIFWriter writer = BIFWriter(model) try: writer.write_bif(filename=file_name) except OSError: print("Permission denied: Saving file to: ", file_name) return False else: print("Successfully save model to: ", file_name) return True
def setUp(self): edges = [['family-out', 'dog-out'], ['bowel-problem', 'dog-out'], ['family-out', 'light-on'], ['dog-out', 'hear-bark']] cpds = {'bowel-problem': np.array([[0.01], [0.99]]), 'dog-out': np.array([[0.99, 0.01, 0.97, 0.03], [0.9, 0.1, 0.3, 0.7]]), 'family-out': np.array([[0.15], [0.85]]), 'hear-bark': np.array([[0.7, 0.3], [0.01, 0.99]]), 'light-on': np.array([[0.6, 0.4], [0.05, 0.95]])} states = {'bowel-problem': ['true', 'false'], 'dog-out': ['true', 'false'], 'family-out': ['true', 'false'], 'hear-bark': ['true', 'false'], 'light-on': ['true', 'false']} parents = {'bowel-problem': [], 'dog-out': ['family-out', 'bowel-problem'], 'family-out': [], 'hear-bark': ['dog-out'], 'light-on': ['family-out']} properties = {'bowel-problem': ['position = (335, 99)'], 'dog-out': ['position = (300, 195)'], 'family-out': ['position = (257, 99)'], 'hear-bark': ['position = (296, 268)'], 'light-on': ['position = (218, 195)']} self.model = BayesianModel(edges) tabular_cpds = [] for var in sorted(cpds.keys()): values = cpds[var] cpd = TabularCPD(var, len(states[var]), values, evidence=parents[var], evidence_card=[len(states[evidence_var]) for evidence_var in parents[var]]) tabular_cpds.append(cpd) self.model.add_cpds(*tabular_cpds) for node, properties in properties.items(): for prop in properties: prop_name, prop_value = map(lambda t: t.strip(), prop.split('=')) self.model.node[node][prop_name] = prop_value self.writer = BIFWriter(model=self.model)
class TestBIFWriter(unittest.TestCase): def setUp(self): edges = [['family-out', 'dog-out'], ['bowel-problem', 'dog-out'], ['family-out', 'light-on'], ['dog-out', 'hear-bark']] cpds = { 'bowel-problem': np.array([[0.01], [0.99]]), 'dog-out': np.array([[0.99, 0.01, 0.97, 0.03], [0.9, 0.1, 0.3, 0.7]]), 'family-out': np.array([[0.15], [0.85]]), 'hear-bark': np.array([[0.7, 0.3], [0.01, 0.99]]), 'light-on': np.array([[0.6, 0.4], [0.05, 0.95]]) } states = { 'bowel-problem': ['true', 'false'], 'dog-out': ['true', 'false'], 'family-out': ['true', 'false'], 'hear-bark': ['true', 'false'], 'light-on': ['true', 'false'] } parents = { 'bowel-problem': [], 'dog-out': ['family-out', 'bowel-problem'], 'family-out': [], 'hear-bark': ['dog-out'], 'light-on': ['family-out'] } properties = { 'bowel-problem': ['position = (335, 99)'], 'dog-out': ['position = (300, 195)'], 'family-out': ['position = (257, 99)'], 'hear-bark': ['position = (296, 268)'], 'light-on': ['position = (218, 195)'] } self.model = BayesianModel(edges) tabular_cpds = [] for var in sorted(cpds.keys()): values = cpds[var] cpd = TabularCPD(var, len(states[var]), values, evidence=parents[var], evidence_card=[ len(states[evidence_var]) for evidence_var in parents[var] ]) tabular_cpds.append(cpd) self.model.add_cpds(*tabular_cpds) for node, properties in properties.items(): for prop in properties: prop_name, prop_value = map(lambda t: t.strip(), prop.split('=')) self.model.node[node][prop_name] = prop_value self.writer = BIFWriter(model=self.model) def test_str(self): self.expected_string = """network unknown { } variable bowel-problem { type discrete [ 2 ] { bowel-problem_0, bowel-problem_1 }; property position = (335, 99) ; } variable dog-out { type discrete [ 2 ] { dog-out_0, dog-out_1 }; property position = (300, 195) ; } variable family-out { type discrete [ 2 ] { family-out_0, family-out_1 }; property position = (257, 99) ; } variable hear-bark { type discrete [ 2 ] { hear-bark_0, hear-bark_1 }; property position = (296, 268) ; } variable light-on { type discrete [ 2 ] { light-on_0, light-on_1 }; property position = (218, 195) ; } probability ( bowel-problem ) { table 0.01, 0.99 ; } probability ( dog-out | bowel-problem, family-out ) { table 0.99, 0.01, 0.97, 0.03, 0.9, 0.1, 0.3, 0.7 ; } probability ( family-out ) { table 0.15, 0.85 ; } probability ( hear-bark | dog-out ) { table 0.7, 0.3, 0.01, 0.99 ; } probability ( light-on | family-out ) { table 0.6, 0.4, 0.05, 0.95 ; } """ self.maxDiff = None self.assertEqual(self.writer.__str__(), self.expected_string)
class TestBIFWriter(unittest.TestCase): def setUp(self): edges = [['family-out', 'dog-out'], ['bowel-problem', 'dog-out'], ['family-out', 'light-on'], ['dog-out', 'hear-bark']] cpds = {'bowel-problem': np.array([[0.01], [0.99]]), 'dog-out': np.array([[0.99, 0.01, 0.97, 0.03], [0.9, 0.1, 0.3, 0.7]]), 'family-out': np.array([[0.15], [0.85]]), 'hear-bark': np.array([[0.7, 0.3], [0.01, 0.99]]), 'light-on': np.array([[0.6, 0.4], [0.05, 0.95]])} states = {'bowel-problem': ['true', 'false'], 'dog-out': ['true', 'false'], 'family-out': ['true', 'false'], 'hear-bark': ['true', 'false'], 'light-on': ['true', 'false']} parents = {'bowel-problem': [], 'dog-out': ['family-out', 'bowel-problem'], 'family-out': [], 'hear-bark': ['dog-out'], 'light-on': ['family-out']} properties = {'bowel-problem': ['position = (335, 99)'], 'dog-out': ['position = (300, 195)'], 'family-out': ['position = (257, 99)'], 'hear-bark': ['position = (296, 268)'], 'light-on': ['position = (218, 195)']} self.model = BayesianModel(edges) tabular_cpds = [] for var in sorted(cpds.keys()): values = cpds[var] cpd = TabularCPD(var, len(states[var]), values, evidence=parents[var], evidence_card=[len(states[evidence_var]) for evidence_var in parents[var]]) tabular_cpds.append(cpd) self.model.add_cpds(*tabular_cpds) for node, properties in properties.items(): for prop in properties: prop_name, prop_value = map(lambda t: t.strip(), prop.split('=')) self.model.node[node][prop_name] = prop_value self.writer = BIFWriter(model=self.model) def test_str(self): self.expected_string = """network unknown { } variable bowel-problem { type discrete [ 2 ] { bowel-problem_0, bowel-problem_1 }; property position = (335, 99) ; } variable dog-out { type discrete [ 2 ] { dog-out_0, dog-out_1 }; property position = (300, 195) ; } variable family-out { type discrete [ 2 ] { family-out_0, family-out_1 }; property position = (257, 99) ; } variable hear-bark { type discrete [ 2 ] { hear-bark_0, hear-bark_1 }; property position = (296, 268) ; } variable light-on { type discrete [ 2 ] { light-on_0, light-on_1 }; property position = (218, 195) ; } probability ( bowel-problem ) { table 0.01, 0.99 ; } probability ( dog-out | bowel-problem, family-out ) { table 0.99, 0.01, 0.97, 0.03, 0.9, 0.1, 0.3, 0.7 ; } probability ( family-out ) { table 0.15, 0.85 ; } probability ( hear-bark | dog-out ) { table 0.7, 0.3, 0.01, 0.99 ; } probability ( light-on | family-out ) { table 0.6, 0.4, 0.05, 0.95 ; } """ self.maxDiff = None self.assertEqual(self.writer.__str__(), self.expected_string)
def save_model(model, fpath): writer = BIFWriter(model) writer.write_bif(filename=fpath)
def time_pathfinder_write(self): BIFWriter(self.pathfinder).write_bif('\tmp')
def time_munin_write(self): BIFWriter(self.munin).write_bif('\tmp')
def time_asia_write(self): BIFWriter(self.asia).write_bif('\tmp')