Пример #1
0
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")
Пример #2
0
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")
Пример #3
0
#-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)
Пример #4
0
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))
Пример #5
0
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(
Пример #6
0
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()
Пример #7
0
#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")])
Пример #8
0
#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:-------"
Пример #9
0
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())
Пример #10
0
#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")}