class ImportExportTest(unittest.TestCase): def setUp(self): # Create BayesNet self.bn = BayesianNetwork() # Create Nodes weather0 = DiscreteNode("Weather0", ["Sun", "Rain"]) weather = DiscreteNode("Weather", ["Sun", "Rain"]) ice_cream_eaten = DiscreteNode("Ice Cream Eaten", [True, False]) # Add nodes self.bn.add_node(weather0) self.bn.add_node(weather) self.bn.add_node(ice_cream_eaten) # Add edges self.bn.add_edge(weather, ice_cream_eaten) self.bn.add_edge(weather0, weather) # Set probabilities cpt_weather0 = numpy.array([.6, .4]) weather0.set_probability_table(cpt_weather0, [weather0]) cpt_weather = numpy.array([[.7, .5], [.3, .5]]) weather.set_probability_table(cpt_weather, [weather0, weather]) ice_cream_eaten.set_probability(.9, [(ice_cream_eaten, True), (weather, "Sun")]) ice_cream_eaten.set_probability(.1, [(ice_cream_eaten, False), (weather, "Sun")]) ice_cream_eaten.set_probability(.2, [(ice_cream_eaten, True), (weather, "Rain")]) ice_cream_eaten.set_probability(.8, [(ice_cream_eaten, False), (weather, "Rain")]) def test_import_export(self): # write BN xmlbif = XMLBIF(self.bn, "Test Net") xmlbif.write("test_out.xmlbif") # read BN bn2 = XMLBIF.read("test_out.xmlbif") for node1 in self.bn.get_nodes(): name_found = False cpd_equal = False value_range_equal = False str_equal = False pos_equal = False for node2 in bn2.get_nodes(): print(node2.name) print(node2.get_cpd()) # Test node names print(node2.name) if node1.name == node2.name: name_found = True cpd_equal = node1.get_cpd() == node2.get_cpd() value_range_equal = node1.get_value_range( ) == node2.get_value_range() str_equal = str(node1) == str(node2) pos_equal = node1.pos == node2.pos self.assertTrue(name_found) self.assertTrue(cpd_equal) self.assertTrue(value_range_equal) self.assertTrue(str_equal) self.assertTrue(pos_equal) # remove file os.remove("test_out.xmlbif")
class ImportExportTest(unittest.TestCase): def setUp(self): # Create BayesNet self.bn = BayesianNetwork(); # Create Nodes weather0 = DiscreteNode("Weather0", ["Sun", "Rain"]) weather = DiscreteNode("Weather", ["Sun", "Rain"]) ice_cream_eaten = DiscreteNode("Ice Cream Eaten", [True, False]) # Add nodes self.bn.add_node(weather0) self.bn.add_node(weather) self.bn.add_node(ice_cream_eaten) # Add edges self.bn.add_edge(weather, ice_cream_eaten) self.bn.add_edge(weather0, weather); # Set probabilities cpt_weather0 = numpy.array([.6, .4]) weather0.set_probability_table(cpt_weather0, [weather0]) cpt_weather = numpy.array([[.7, .5], [.3, .5]]) weather.set_probability_table(cpt_weather, [weather0, weather]) ice_cream_eaten.set_probability(.9, [(ice_cream_eaten, True), (weather, "Sun")]) ice_cream_eaten.set_probability(.1, [(ice_cream_eaten, False), (weather, "Sun")]) ice_cream_eaten.set_probability(.2, [(ice_cream_eaten, True), (weather, "Rain")]) ice_cream_eaten.set_probability(.8, [(ice_cream_eaten, False), (weather, "Rain")]) def test_import_export(self): # write BN xmlbif = XMLBIF(self.bn, "Test Net") xmlbif.write("test_out.xmlbif") # read BN bn2 = XMLBIF.read("test_out.xmlbif") for node1 in self.bn.get_nodes(): name_found = False cpd_equal = False value_range_equal = False str_equal = False pos_equal = False for node2 in bn2.get_nodes(): print(node2.name) print(node2.get_cpd()) # Test node names print(node2.name) if node1.name == node2.name: name_found = True cpd_equal = node1.get_cpd() == node2.get_cpd() value_range_equal = node1.get_value_range() == node2.get_value_range() str_equal = str(node1) == str(node2) pos_equal = node1.pos == node2.pos self.assertTrue(name_found) self.assertTrue(cpd_equal) self.assertTrue(value_range_equal) self.assertTrue(str_equal) self.assertTrue(pos_equal) # remove file os.remove("test_out.xmlbif")
#-Probability of evidence #-Maximum a-posteriori hypothesis #Construct some simple BayesianNetwork. #topology bn = BayesianNetwork() cnf=ContinuousNodeFactory() age = cnf.createExponentialNode("Plant_age") height = cnf.createGaussNode("Plant_height") diameter = cnf.createBetaNode("Plant_diameter") bn.add_node(age) bn.add_node(height) bn.add_node(diameter) bn.add_edge(age,height) bn.add_edge(age,diameter) #parameterization #Semantics: Many young plants and the higher the age the lower the probabilty #->lambda=2.0 age_parameters=ExponentialParameters(0.0,{}) age.set_density_parameters(age_parameters) #Semantics: plants start at 0.1 meters underground and grow each year by 1 meter. # variance is 0.3 height_parameters=GaussParameters(-0.1,{age:1},0.3) height.set_density_parameters(height_parameters)
growth = cnf.createGaussNode("Growth") height = cnf.createBetaNode("Height") diameter = cnf.createExponentialNode("Diameter") children = cnf.createExponentialNode("Children") # add the nodes to the network bn.add_node(age) bn.add_node(sun) bn.add_node(ground) bn.add_node(growth) bn.add_node(height) bn.add_node(diameter) bn.add_node(children) # include connectivity bn.add_edge(age, growth) bn.add_edge(ground, growth) bn.add_edge(sun, growth) bn.add_edge(growth, diameter) bn.add_edge(growth, height) bn.add_edge(height, children) bn.add_edge(ground, children) # parameterization age.set_density_parameters(ExponentialParameters(0.1, {})) sun.set_density_parameters(BetaParameters(2, {}, 2, {})) ground.set_density_parameters(GaussParameters(2.0, {}, 1.5)) growth.set_density_parameters(GaussParameters(0.1, {age: 5.0, ground: 1.0, sun: 4.0}, 2.5))
growth = cnf.createGaussNode("Growth") height = cnf.createBetaNode("Height") diameter = cnf.createExponentialNode("Diameter") children = cnf.createExponentialNode("Children") #add the nodes to the network bn.add_node(age) bn.add_node(sun) bn.add_node(ground) bn.add_node(growth) bn.add_node(height) bn.add_node(diameter) bn.add_node(children) #include connectivity bn.add_edge(age, growth) bn.add_edge(ground, growth) bn.add_edge(sun, growth) bn.add_edge(growth, diameter) bn.add_edge(growth, height) bn.add_edge(height, children) bn.add_edge(ground, children) #parameterization age.set_density_parameters(ExponentialParameters(0.1, {})) sun.set_density_parameters(BetaParameters(2, {}, 2, {})) ground.set_density_parameters(GaussParameters(2.0, {}, 1.5)) growth.set_density_parameters(
bn = BayesianNetwork() burglary = DiscreteNode("Burglary", ["Intruder","Safe"]) alarm = DiscreteNode("Alarm", ["Ringing", "Silent","Kaputt"]) earthquake = DiscreteNode("Earthquake", ["Shaking", "Calm"]) john_calls = DiscreteNode("John calls", ["Calling", "Not Calling"]) mary_calls = DiscreteNode("Mary calls", ["Calling", "Not Calling"]) bn.add_node(burglary) bn.add_node(alarm) bn.add_node(earthquake) bn.add_node(john_calls) bn.add_node(mary_calls) bn.add_edge(burglary,alarm) bn.add_edge(earthquake, alarm) bn.add_edge(alarm, john_calls) bn.add_edge(alarm, mary_calls) burglary.set_probability(0.2,[(burglary,"Intruder")]) alarm.set_probability(0.1,[(alarm,"Ringing"),(burglary,"Safe"),(earthquake,"Calm")]) cpt = numpy.array([[0.1,0.9],[0.5,0.5],[0.4,0.6]]) john_calls.set_probability_table(cpt, [alarm, john_calls]) print john_calls.is_valid() print alarm.is_valid()
#create Nodes with Name and the possible values burglary = DiscreteNode("Burglary", ["Intruder","Safe"]) alarm = DiscreteNode("Alarm", ["Ringing", "Silent"]) earthquake = DiscreteNode("Earthquake", ["Shaking", "Calm"]) john_calls = DiscreteNode("John calls", ["Calling", "Not Calling"]) baum_calls = DiscreteNode("Baum calls", ["Calling", "Not Calling"]) # add Nodes to BayesNet bn.add_node(burglary) bn.add_node(alarm) bn.add_node(earthquake) bn.add_node(john_calls) bn.add_node(baum_calls) # Add edges to show dependencies bn.add_edge(burglary,alarm) bn.add_edge(earthquake, alarm) bn.add_edge(alarm, john_calls) bn.add_edge(alarm, baum_calls) #create probability tables and set them in the node cpt_burglary = numpy.array([0.001,0.999]) burglary.set_probability_table(cpt_burglary,[burglary]) cpt_earthquake = numpy.array([0.002,0.998]) earthquake.set_probability_table(cpt_earthquake,[earthquake]) #another possibility to set probabilities alarm.set_probability(0.95,[(alarm,"Ringing"),(burglary,"Intruder"),(earthquake,"Shaking")]) alarm.set_probability(0.05,[(alarm,"Silent"),(burglary,"Intruder"),(earthquake,"Shaking")]) alarm.set_probability(0.29,[(alarm,"Ringing"),(burglary,"Safe"),(earthquake,"Shaking")])
#bayesian network. At first that network is being constructed and afterwards it #is passed to an MCMC object that is used to answer several kinds of questions: #-Prior marginal #-Posterior marginal #-Probability of evidence #-Maximum a-posteriori hypothesis #Construct some simple BayesianNetwork bn = BayesianNetwork() burglary = DiscreteNode("Burglary", ["Intruder", "Safe"]) alarm = DiscreteNode("Alarm", ["Ringing", "Silent", "Destroyed"]) bn.add_node(burglary) bn.add_node(alarm) bn.add_edge(burglary, alarm) #Parametrize the network burglary_cpt = numpy.array([0.2, 0.8]) burglary.set_probability_table(burglary_cpt, [burglary]) alarm_cpt = numpy.array([[0.8, 0.15, 0.05], [0.05, 0.9, 0.05]]) alarm.set_probability_table(alarm_cpt, [burglary, alarm]) #Get some inference object mcmc_ask = MCMC(bn, 5000, transition_model=GibbsTransitionModel()) #Do some Inferences evidence = {burglary: EvEq("Intruder")} print "-------ProbabilityOfEvidence:-------"
class NodeAddAndRemoveTestCase(unittest.TestCase): def setUp(self): self.bn = BayesianNetwork() def tearDown(self): self.bn = None def test_clear_and_len(self): self.assertFalse(0 == len(self.bn)) self.assertFalse(0 == self.bn.number_of_nodes()) self.bn.clear() self.assertEqual(0, len(self.bn)) self.assertEqual(0, self.bn.number_of_nodes()) def test_add_node(self): self.bn.clear() n = DiscreteNode("Some Node", [True, False]) self.bn.add_node(n) self.assertEqual(n, self.bn.get_node("Some Node")) self.assertTrue(n in self.bn.get_nodes(["Some Node"])) node_with_same_name = DiscreteNode("Some Node", [True, False]) self.assertRaises(Exception, self.bn.add_node, node_with_same_name) def test_remove_node(self): self.bn.clear() n = DiscreteNode("Some Node to remove", [True, False]) self.bn.add_node(n) self.bn.remove_node(n) self.assertFalse(n in self.bn.get_nodes([])) def test_add_edge(self): self.bn.clear() n1 = DiscreteNode("1", [True, False]) n2 = DiscreteNode("2", [True, False]) self.bn.add_node(n1) self.bn.add_node(n2) self.bn.add_edge(n1, n2) self.assertTrue(n1 in self.bn.get_parents(n2)) self.assertTrue(n2 in self.bn.get_children(n1)) def test_remove_edge(self): self.bn.clear() n1 = DiscreteNode("1", [True, False]) n2 = DiscreteNode("2", [True, False]) self.bn.add_node(n1) self.bn.add_node(n2) self.bn.add_edge(n1, n2) self.assertEqual([n1], self.bn.get_parents(n2)) self.bn.remove_edge(n1, n2) self.assertEqual([], self.bn.get_parents(n2)) def test_is_valid(self): self.bn.clear() n1 = DiscreteNode("1", [True, False]) n2 = DiscreteNode("2", [True, False]) self.bn.add_node(n1) self.bn.add_node(n2) self.bn.add_edge(n1, n2) self.assertTrue(self.bn.is_valid()) self.bn.add_edge(n1, n1) self.assertFalse(self.bn.is_valid()) self.bn.remove_edge(n1, n1) self.assertTrue(self.bn.is_valid()) n3 = DiscreteNode("3", [True, False]) n4 = DiscreteNode("4", [True, False]) self.bn.add_node(n3) self.bn.add_node(n4) self.assertTrue(self.bn.is_valid()) self.bn.add_edge(n2, n3) self.assertTrue(self.bn.is_valid()) self.bn.add_edge(n3, n4) self.assertTrue(self.bn.is_valid()) self.bn.add_edge(n4, n1) self.assertFalse(self.bn.is_valid())
#bayesian network. At first that network is being constructed and afterwards it #is passed to an MCMC object that is used to answer several kinds of questions: #-Prior marginal #-Posterior marginal #-Probability of evidence #-Maximum a-posteriori hypothesis #Construct some simple BayesianNetwork bn = BayesianNetwork() burglary = DiscreteNode("Burglary", ["Intruder","Safe"]) alarm = DiscreteNode("Alarm", ["Ringing", "Silent","Destroyed"]) bn.add_node(burglary) bn.add_node(alarm) bn.add_edge(burglary,alarm) #Parametrize the network burglary_cpt=numpy.array([0.2,0.8]) burglary.set_probability_table(burglary_cpt, [burglary]) alarm_cpt=numpy.array([[0.8,0.15,0.05],[0.05,0.9,0.05]]) alarm.set_probability_table(alarm_cpt, [burglary,alarm]) #Get some inference object mcmc_ask=MCMC(bn,5000,transition_model=GibbsTransitionModel()) #Do some Inferences evidence={burglary:EvEq("Intruder")}