예제 #1
0
    def setUp(self):
        # A test Bayesian model
        diff_cpd = TabularCPD('diff', 2, [[0.6], [0.4]])
        intel_cpd = TabularCPD('intel', 2, [[0.7], [0.3]])
        grade_cpd = TabularCPD('grade',
                               3,
                               [[0.3, 0.05, 0.9, 0.5], [0.4, 0.25, 0.08, 0.3],
                                [0.3, 0.7, 0.02, 0.2]],
                               evidence=['diff', 'intel'],
                               evidence_card=[2, 2])
        self.bayesian_model = BayesianModel()
        self.bayesian_model.add_nodes_from(['diff', 'intel', 'grade'])
        self.bayesian_model.add_edges_from([('diff', 'grade'),
                                            ('intel', 'grade')])
        self.bayesian_model.add_cpds(diff_cpd, intel_cpd, grade_cpd)

        # A test Markov model
        self.markov_model = MarkovModel([('A', 'B'), ('C', 'B'), ('B', 'D')])
        factor_ab = DiscreteFactor(['A', 'B'], [2, 3], [1, 2, 3, 4, 5, 6])
        factor_cb = DiscreteFactor(['C', 'B'], [4, 3],
                                   [3, 1, 4, 5, 7, 8, 1, 3, 10, 4, 5, 6])
        factor_bd = DiscreteFactor(['B', 'D'], [3, 2], [5, 7, 2, 1, 9, 3])
        self.markov_model.add_factors(factor_ab, factor_cb, factor_bd)

        self.gibbs = GibbsSampling(self.bayesian_model)
예제 #2
0
    def test_check_model2(self):
        cpd_s = TabularCPD('s',
                           2,
                           values=np.array([[0.5, 0.3], [0.8, 0.7]]),
                           evidence=['i'],
                           evidence_card=[2])
        self.G.add_cpds(cpd_s)
        self.assertRaises(ValueError, self.G.check_model)
        self.G.remove_cpds(cpd_s)

        cpd_g = TabularCPD('g',
                           2,
                           values=np.array([[0.2, 0.3, 0.4, 0.6],
                                            [0.3, 0.7, 0.6, 0.4]]),
                           evidence=['d', 'i'],
                           evidence_card=[2, 2])
        self.G.add_cpds(cpd_g)
        self.assertRaises(ValueError, self.G.check_model)
        self.G.remove_cpds(cpd_g)

        cpd_l = TabularCPD('l',
                           2,
                           values=np.array([[0.2, 0.3], [0.1, 0.7]]),
                           evidence=['g'],
                           evidence_card=[2])
        self.G.add_cpds(cpd_l)
        self.assertRaises(ValueError, self.G.check_model)
        self.G.remove_cpds(cpd_l)
예제 #3
0
    def test_check_model(self):
        cpd_g = TabularCPD('g',
                           2,
                           values=np.array([[0.2, 0.3, 0.4, 0.6],
                                            [0.8, 0.7, 0.6, 0.4]]),
                           evidence=['d', 'i'],
                           evidence_card=[2, 2])

        cpd_s = TabularCPD('s',
                           2,
                           values=np.array([[0.2, 0.3], [0.8, 0.7]]),
                           evidence=['i'],
                           evidence_card=[2])

        cpd_l = TabularCPD('l',
                           2,
                           values=np.array([[0.2, 0.3], [0.8, 0.7]]),
                           evidence=['g'],
                           evidence_card=[2])

        self.G.add_cpds(cpd_g, cpd_s, cpd_l)
        self.assertRaises(ValueError, self.G.check_model)

        cpd_d = TabularCPD('d', 2, values=[[0.8, 0.2]])
        cpd_i = TabularCPD('i', 2, values=[[0.7, 0.3]])
        self.G.add_cpds(cpd_d, cpd_i)

        self.assertTrue(self.G.check_model())
예제 #4
0
    def test_add_multiple_cpds(self):
        cpd_d = TabularCPD('d', 2, values=np.random.rand(2, 1))
        cpd_i = TabularCPD('i', 2, values=np.random.rand(2, 1))
        cpd_g = TabularCPD('g',
                           2,
                           values=np.random.rand(2, 4),
                           evidence=['d', 'i'],
                           evidence_card=[2, 2])
        cpd_l = TabularCPD('l',
                           2,
                           values=np.random.rand(2, 2),
                           evidence=['g'],
                           evidence_card=[2])
        cpd_s = TabularCPD('s',
                           2,
                           values=np.random.rand(2, 2),
                           evidence=['i'],
                           evidence_card=[2])

        self.G.add_cpds(cpd_d, cpd_i, cpd_g, cpd_l, cpd_s)
        self.assertEqual(self.G.get_cpds('d'), cpd_d)
        self.assertEqual(self.G.get_cpds('i'), cpd_i)
        self.assertEqual(self.G.get_cpds('g'), cpd_g)
        self.assertEqual(self.G.get_cpds('l'), cpd_l)
        self.assertEqual(self.G.get_cpds('s'), cpd_s)
예제 #5
0
    def initialize_initial_state(self):
        """
        This method will automatically re-adjust the cpds and the edges added to the bayesian network.
        If an edge that is added as an intra time slice edge in the 0th timeslice, this method will
        automatically add it in the 1st timeslice. It will also add the cpds. However, to call this
        method, one needs to add cpds as well as the edges in the bayesian network of the whole
        skeleton including the 0th and the 1st timeslice,.

        Examples:
        -------
        >>> from pgm.models import DynamicBayesianNetwork as DBN
        >>> from pgm.factors.discrete import TabularCPD
        >>> student = DBN()
        >>> student.add_nodes_from(['D', 'G', 'I', 'S', 'L'])
        >>> student.add_edges_from([(('D', 0),('G', 0)),(('I', 0),('G', 0)),(('D', 0),('D', 1)),(('I', 0),('I', 1))])
        >>> grade_cpd = TabularCPD(('G', 0), 3, [[0.3, 0.05, 0.9, 0.5],
        ...                                      [0.4, 0.25, 0.8, 0.03],
        ...                                      [0.3, 0.7, 0.02, 0.2]],
        ...                        evidence=[('I', 0),('D', 0)],
        ...                        evidence_card=[2, 2])
        >>> d_i_cpd = TabularCPD(('D', 1), 2, [[0.6, 0.3],
        ...                                    [0.4, 0.7]],
        ...                      evidence=[('D', 0)],
        ...                      evidence_card=2)
        >>> diff_cpd = TabularCPD(('D', 0), 2, [[0.6, 0.4]])
        >>> intel_cpd = TabularCPD(('I',0), 2, [[0.7, 0.3]])
        >>> i_i_cpd = TabularCPD(('I', 1), 2, [[0.5, 0.4],
        ...                                    [0.5, 0.6]],
        ...                      evidence=[('I', 0)],
        ...                      evidence_card=2)
        >>> student.add_cpds(grade_cpd, d_i_cpd, diff_cpd, intel_cpd, i_i_cpd)
        >>> student.initialize_initial_state()
        """
        for cpd in self.cpds:
            temp_var = (cpd.variable[0], 1 - cpd.variable[1])
            parents = self.get_parents(temp_var)
            if not any(x.variable == temp_var for x in self.cpds):
                if all(x[1] == parents[0][1] for x in parents):
                    if parents:
                        evidence_card = cpd.cardinality[:0:-1]
                        new_cpd = TabularCPD(
                            temp_var, cpd.variable_card,
                            cpd.values.reshape(cpd.variable_card,
                                               np.prod(evidence_card)),
                            parents, evidence_card)
                    else:
                        if cpd.get_evidence():
                            initial_cpd = cpd.marginalize(cpd.get_evidence(),
                                                          inplace=False)
                            new_cpd = TabularCPD(
                                temp_var, cpd.variable_card,
                                np.reshape(initial_cpd.values, (-1, 2)))
                        else:
                            new_cpd = TabularCPD(
                                temp_var, cpd.variable_card,
                                np.reshape(cpd.values, (-1, 2)))
                    self.add_cpds(new_cpd)
            self.check_model()
예제 #6
0
파일: bayesian.py 프로젝트: glher/PHASED
    def phm_bin(self, fname, cpd_w, phm_dat):
        weakness = 'Weakness %s' % fname
        detection = 'Detection %s' % fname
        corrective_action = 'Corrective Action %s' % fname
        failure = 'Failure %s' % fname
        if phm_dat['On'][fname]:
            self.model.add_edges_from([(weakness, detection),
                                       (weakness, corrective_action),
                                       (weakness, failure),
                                       (detection, corrective_action),
                                       (corrective_action, failure)])

            # Defining individual PHMs data.
            phm_eff = phm_dat['Efficiency'][fname]['zero']
            phm_err = phm_dat['Error'][fname]
            phm_fck = phm_dat['Fuckup'][fname]
            phm_rpr = phm_dat['Repair'][fname]['zero']

            cpd_d = TabularCPD(variable=detection,
                               variable_card=2,
                               values=[[phm_eff, phm_err],
                                       [(1 - phm_eff), (1 - phm_err)]],
                               evidence=[weakness],
                               evidence_card=[2])

            # 0 or 1, action or not. This can be more nuanced, teams available, expertise, training, management, etc.
            # A detection might not automatically generate a corrective action.
            cpd_c = TabularCPD(variable=corrective_action,
                               variable_card=2,
                               values=[[1., 0., 1., 0.], [0., 1., 0., 1.]],
                               evidence=[weakness, detection],
                               evidence_card=[2, 2])

            cpd_f = TabularCPD(variable=failure,
                               variable_card=2,
                               values=[[1 - phm_rpr, 1., phm_fck, 0.],
                                       [phm_rpr, 0., 1 - phm_fck, 1.]],
                               evidence=[weakness, corrective_action],
                               evidence_card=[2, 2])

            # Associating the CPDs with the network
            self.model.add_cpds(cpd_w, cpd_d, cpd_c, cpd_f)
        else:
            self.model.add_edges_from([(weakness, failure)])

            cpd_f = TabularCPD(variable=failure,
                               variable_card=2,
                               values=[[1., 0.], [0., 1.]],
                               evidence=[weakness],
                               evidence_card=[2])
            self.model.add_cpds(cpd_w, cpd_f)
        # check_model checks for the network structure and CPDs and verifies that the CPDs are correctly
        # defined and sum to 1.
        self.model.check_model()

        return self.model
예제 #7
0
    def estimate_cpd(self, node):
        """
        Method to estimate the CPD for a given variable.

        Parameters
        ----------
        node: int, string (any hashable python object)
            The name of the variable for which the CPD is to be estimated.

        Returns
        -------
        CPD: TabularCPD

        Examples
        --------
        >>> import pandas as pd
        >>> from pgm.models import BayesianModel
        >>> from pgm.estimators import MaximumLikelihoodEstimator
        >>> data = pd.DataFrame(data={'A': [0, 0, 1], 'B': [0, 1, 0], 'C': [1, 1, 0]})
        >>> model = BayesianModel([('A', 'C'), ('B', 'C')])
        >>> cpd_A = MaximumLikelihoodEstimator(model, data).estimate_cpd('A')
        >>> print(cpd_A)
        ╒══════╤══════════╕
        │ A(0) │ 0.666667 │
        ├──────┼──────────┤
        │ A(1) │ 0.333333 │
        ╘══════╧══════════╛
        >>> cpd_C = MaximumLikelihoodEstimator(model, data).estimate_cpd('C')
        >>> print(cpd_C)
        ╒══════╤══════╤══════╤══════╤══════╕
        │ A    │ A(0) │ A(0) │ A(1) │ A(1) │
        ├──────┼──────┼──────┼──────┼──────┤
        │ B    │ B(0) │ B(1) │ B(0) │ B(1) │
        ├──────┼──────┼──────┼──────┼──────┤
        │ C(0) │ 0.0  │ 0.0  │ 1.0  │ 0.5  │
        ├──────┼──────┼──────┼──────┼──────┤
        │ C(1) │ 1.0  │ 1.0  │ 0.0  │ 0.5  │
        ╘══════╧══════╧══════╧══════╧══════╛
        """

        state_counts = self.state_counts(node)

        # if a column contains only `0`s (no states observed for some configuration
        # of parents' states) fill that column uniformly instead
        state_counts.ix[:, (state_counts == 0).all()] = 1

        parents = sorted(self.model.get_parents(node))
        parents_cardinalities = [len(self.state_names[parent]) for parent in parents]
        node_cardinality = len(self.state_names[node])

        cpd = TabularCPD(node, node_cardinality, np.array(state_counts),
                         evidence=parents,
                         evidence_card=parents_cardinalities,
                         state_names=self.state_names)
        cpd.normalize()
        return cpd
예제 #8
0
 def test_get_cpd_raises_error(self):
     cpd1 = TabularCPD('diff', 2, values=np.random.rand(2, 1))
     cpd2 = TabularCPD('intel', 2, values=np.random.rand(2, 1))
     cpd3 = TabularCPD('grade',
                       2,
                       values=np.random.rand(2, 4),
                       evidence=['diff', 'intel'],
                       evidence_card=[2, 2])
     self.graph.add_edges_from([('diff', 'grade'), ('intel', 'grade')])
     self.graph.add_cpds(cpd1, cpd2, cpd3)
     self.assertRaises(ValueError, self.graph.get_cpds, 'sat')
예제 #9
0
    def test_estimate_cpd_dirichlet(self):
        cpd_A = self.est1.estimate_cpd('A',  prior_type="dirichlet", pseudo_counts=[0, 1])
        self.assertEqual(cpd_A, TabularCPD('A', 2, [[0.5], [0.5]]))

        cpd_B = self.est1.estimate_cpd('B',  prior_type="dirichlet", pseudo_counts=[9, 3])
        self.assertEqual(cpd_B, TabularCPD('B', 2, [[11.0/15], [4.0/15]]))

        cpd_C = self.est1.estimate_cpd('C',  prior_type="dirichlet", pseudo_counts=[0.4, 0.6])
        self.assertEqual(cpd_C, TabularCPD('C', 2, [[0.2, 0.2, 0.7, 0.4],
                                                    [0.8, 0.8, 0.3, 0.6]],
                                           evidence=['A', 'B'], evidence_card=[2, 2]))
예제 #10
0
 def test_add_multiple_cpds(self):
     cpd1 = TabularCPD('diff', 2, values=np.random.rand(2, 1))
     cpd2 = TabularCPD('intel', 2, values=np.random.rand(2, 1))
     cpd3 = TabularCPD('grade',
                       2,
                       values=np.random.rand(2, 4),
                       evidence=['diff', 'intel'],
                       evidence_card=[2, 2])
     self.graph.add_edges_from([('diff', 'grade'), ('intel', 'grade')])
     self.graph.add_cpds(cpd1, cpd2, cpd3)
     self.assertListEqual(self.graph.get_cpds(), [cpd1, cpd2, cpd3])
예제 #11
0
 def test_get_cpd_for_node(self):
     cpd1 = TabularCPD('diff', 2, values=np.random.rand(2, 1))
     cpd2 = TabularCPD('intel', 2, values=np.random.rand(2, 1))
     cpd3 = TabularCPD('grade',
                       2,
                       values=np.random.rand(2, 4),
                       evidence=['diff', 'intel'],
                       evidence_card=[2, 2])
     self.graph.add_edges_from([('diff', 'grade'), ('intel', 'grade')])
     self.graph.add_cpds(cpd1, cpd2, cpd3)
     self.assertEqual(self.graph.get_cpds('diff'), cpd1)
     self.assertEqual(self.graph.get_cpds('intel'), cpd2)
     self.assertEqual(self.graph.get_cpds('grade'), cpd3)
예제 #12
0
 def test_fit_missing_data(self):
     self.model2.fit(self.data2,
                     state_names={'C': [0, 1]},
                     complete_samples_only=False)
     cpds = set([
         TabularCPD('A', 2, [[0.5], [0.5]]),
         TabularCPD('B', 2, [[2. / 3], [1. / 3]]),
         TabularCPD('C',
                    2, [[0, 0.5, 0.5, 0.5], [1, 0.5, 0.5, 0.5]],
                    evidence=['A', 'B'],
                    evidence_card=[2, 2])
     ])
     self.assertSetEqual(cpds, set(self.model2.get_cpds()))
예제 #13
0
    def test_estimate_cpd_shortcuts(self):
        cpd_C1 = self.est2.estimate_cpd('C',  prior_type='BDeu', equivalent_sample_size=9)
        cpd_C1_correct = TabularCPD('C', 3, [[0.2, 0.2, 0.6, 1./3, 1./3, 1./3],
                                             [0.6, 0.6, 0.2, 1./3, 1./3, 1./3],
                                             [0.2, 0.2, 0.2, 1./3, 1./3, 1./3]],
                                    evidence=['A', 'B'], evidence_card=[3, 2])
        self.assertEqual(cpd_C1, cpd_C1_correct)

        cpd_C2 = self.est3.estimate_cpd('C',  prior_type='K2')
        cpd_C2_correct = TabularCPD('C', 2, [[0.5, 0.6, 1./3, 2./3, 0.75, 2./3],
                                             [0.5, 0.4, 2./3, 1./3, 0.25, 1./3]],
                                    evidence=['A', 'B'], evidence_card=[3, 2])
        self.assertEqual(cpd_C2, cpd_C2_correct)
예제 #14
0
 def setUp(self):
     self.G = BayesianModel([('a', 'd'), ('b', 'd'), ('d', 'e'),
                             ('b', 'c')])
     self.G1 = BayesianModel([('diff', 'grade'), ('intel', 'grade')])
     diff_cpd = TabularCPD('diff', 2, values=[[0.2], [0.8]])
     intel_cpd = TabularCPD('intel', 3, values=[[0.5], [0.3], [0.2]])
     grade_cpd = TabularCPD('grade',
                            3,
                            values=[[0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
                                    [0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
                                    [0.8, 0.8, 0.8, 0.8, 0.8, 0.8]],
                            evidence=['diff', 'intel'],
                            evidence_card=[2, 3])
     self.G1.add_cpds(diff_cpd, intel_cpd, grade_cpd)
예제 #15
0
 def setUp(self):
     dbn_1 = DynamicBayesianNetwork()
     dbn_1.add_edges_from(
         [(('Z', 0), ('X', 0)), (('Z', 0), ('Y', 0)), (('Z', 0), ('Z', 1))])
     cpd_start_z_1 = TabularCPD(('Z', 0), 2, [[0.8, 0.2]])
     cpd_x_1 = TabularCPD(
         ('X', 0), 2, [[0.9, 0.6], [0.1, 0.4]], [('Z', 0)], [2])
     cpd_y_1 = TabularCPD(
         ('Y', 0), 2, [[0.7, 0.2], [0.3, 0.8]], [('Z', 0)], [2])
     cpd_trans_z_1 = TabularCPD(
         ('Z', 1), 2, [[0.9, 0.1], [0.1, 0.9]], [('Z', 0)], [2])
     dbn_1.add_cpds(cpd_start_z_1, cpd_trans_z_1, cpd_x_1, cpd_y_1)
     dbn_1.initialize_initial_state()
     self.dbn_inference_1 = DBNInference(dbn_1)
     dbn_2 = DynamicBayesianNetwork()
     dbn_2.add_edges_from([(('Z', 0), ('X', 0)), (('X', 0), ('Y', 0)),
                           (('Z', 0), ('Z', 1))])
     cpd_start_z_2 = TabularCPD(('Z', 0), 2, [[0.5, 0.5]])
     cpd_x_2 = TabularCPD(
         ('X', 0), 2, [[0.6, 0.9], [0.4, 0.1]], [('Z', 0)], [2])
     cpd_y_2 = TabularCPD(
         ('Y', 0), 2, [[0.2, 0.3], [0.8, 0.7]], [('X', 0)], [2])
     cpd_z_2 = TabularCPD(
         ('Z', 1), 2, [[0.4, 0.7], [0.6, 0.3]], [('Z', 0)], [2])
     dbn_2.add_cpds(cpd_x_2, cpd_y_2, cpd_z_2, cpd_start_z_2)
     dbn_2.initialize_initial_state()
     self.dbn_inference_2 = DBNInference(dbn_2)
예제 #16
0
    def test_get_cpds1(self):
        self.model = BayesianModel([('A', 'AB')])
        cpd_a = TabularCPD('A', 2, values=np.random.rand(2, 1))
        cpd_ab = TabularCPD('AB',
                            2,
                            values=np.random.rand(2, 2),
                            evidence=['A'],
                            evidence_card=[2])

        self.model.add_cpds(cpd_a, cpd_ab)
        self.assertEqual(self.model.get_cpds('A').variable, 'A')
        self.assertEqual(self.model.get_cpds('AB').variable, 'AB')
        self.assertRaises(ValueError, self.model.get_cpds, 'B')

        self.model.add_node('B')
        self.assertRaises(ValueError, self.model.get_cpds, 'B')
예제 #17
0
파일: test_BIF.py 프로젝트: glher/PHASED
    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)
예제 #18
0
파일: XMLBIF.py 프로젝트: glher/PHASED
    def get_model(self):
        model = BayesianModel(self.get_edges())
        model.name = self.network_name

        tabular_cpds = []
        for var, values in self.variable_CPD.items():
            evidence_card = [
                len(self.variable_states[evidence_var])
                for evidence_var in self.variable_parents[var]
            ]
            cpd = TabularCPD(var,
                             len(self.variable_states[var]),
                             values,
                             evidence=self.variable_parents[var],
                             evidence_card=evidence_card,
                             state_names=self.get_states())
            tabular_cpds.append(cpd)

        model.add_cpds(*tabular_cpds)

        for node, properties in self.variable_property.items():
            for prop in properties:
                if prop is not None:
                    prop_name, prop_value = map(lambda t: t.strip(),
                                                prop.split('='))
                    model.node[node][prop_name] = prop_value

        return model
예제 #19
0
    def test_add_cpds(self):
        self.model.add_cpds(self.cpd1)
        cpd = self.model.get_cpds('x1')
        self.assertEqual(cpd.variable, self.cpd1.variable)
        self.assertEqual(cpd.variance, self.cpd1.variance)
        self.assertEqual(cpd.beta_0, self.cpd1.beta_0)

        self.model.add_cpds(self.cpd2)
        cpd = self.model.get_cpds('x2')
        self.assertEqual(cpd.variable, self.cpd2.variable)
        self.assertEqual(cpd.variance, self.cpd2.variance)
        self.assertEqual(cpd.beta_0, self.cpd2.beta_0)
        self.assertEqual(cpd.evidence, self.cpd2.evidence)
        np_test.assert_array_equal(cpd.beta_vector, self.cpd2.beta_vector)

        self.model.add_cpds(self.cpd3)
        cpd = self.model.get_cpds('x3')
        self.assertEqual(cpd.variable, self.cpd3.variable)
        self.assertEqual(cpd.variance, self.cpd3.variance)
        self.assertEqual(cpd.beta_0, self.cpd3.beta_0)
        self.assertEqual(cpd.evidence, self.cpd3.evidence)
        np_test.assert_array_equal(cpd.beta_vector, self.cpd3.beta_vector)

        tab_cpd = TabularCPD(
            'grade',
            3, [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1], [0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
                [0.8, 0.8, 0.8, 0.8, 0.8, 0.8]],
            evidence=['diff', 'intel'],
            evidence_card=[2, 3])
        self.assertRaises(ValueError, self.model.add_cpds, tab_cpd)
        self.assertRaises(ValueError, self.model.add_cpds, 1)
        self.assertRaises(ValueError, self.model.add_cpds, 1, tab_cpd)
예제 #20
0
 def test_estimate_cpd_improper_prior(self):
     cpd_C = self.est1.estimate_cpd('C',  prior_type="dirichlet", pseudo_counts=[0, 0])
     cpd_C_correct = (TabularCPD('C', 2, [[0.0, 0.0, 1.0, np.NaN],
                                          [1.0, 1.0, 0.0, np.NaN]],
                                 evidence=['A', 'B'], evidence_card=[2, 2],
                                 state_names={'A': [0, 1], 'B': [0, 1], 'C': [0, 1]}))
     # manual comparison because np.NaN != np.NaN
     self.assertTrue(((cpd_C.values == cpd_C_correct.values) |
                      np.isnan(cpd_C.values) & np.isnan(cpd_C_correct.values)).all())
예제 #21
0
 def test_bayesian_fit(self):
     print(isinstance(BayesianEstimator, BaseEstimator))
     print(isinstance(MaximumLikelihoodEstimator, BaseEstimator))
     self.model2.fit(self.data1,
                     estimator_type=BayesianEstimator,
                     prior_type="dirichlet",
                     pseudo_counts=[9, 3])
     self.assertEqual(self.model2.get_cpds('B'),
                      TabularCPD('B', 2, [[11.0 / 15], [4.0 / 15]]))
예제 #22
0
 def test_add_single_cpd(self):
     cpd = TabularCPD('grade',
                      2,
                      values=np.random.rand(2, 4),
                      evidence=['diff', 'intel'],
                      evidence_card=[2, 2])
     self.graph.add_edges_from([('diff', 'grade'), ('intel', 'grade')])
     self.graph.add_cpds(cpd)
     self.assertListEqual(self.graph.get_cpds(), [cpd])
예제 #23
0
    def setUp(self):
        self.maxDiff = None
        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': ['bowel-problem', 'family-out'],
                   'family-out': [],
                   'hear-bark': ['dog-out'],
                   'light-on': ['family-out']}

        self.bayesmodel = BayesianModel(edges)

        tabular_cpds = []
        for var, values in cpds.items():
            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.bayesmodel.add_cpds(*tabular_cpds)
        self.bayeswriter = UAIWriter(self.bayesmodel)

        edges = {('var_0', 'var_1'), ('var_0', 'var_2'), ('var_1', 'var_2')}
        self.markovmodel = MarkovModel(edges)
        tables = [(['var_0', 'var_1'],
                   ['4.000', '2.400', '1.000', '0.000']),
                  (['var_0', 'var_1', 'var_2'],
                   ['2.2500', '3.2500', '3.7500', '0.0000', '0.0000', '10.0000',
                    '1.8750', '4.0000', '3.3330', '2.0000', '2.0000', '3.4000'])]
        domain = {'var_1': '2', 'var_2': '3', 'var_0': '2'}
        factors = []
        for table in tables:
            variables = table[0]
            cardinality = [int(domain[var]) for var in variables]
            values = list(map(float, table[1]))
            factor = DiscreteFactor(variables, cardinality, values)
            factors.append(factor)
        self.markovmodel.add_factors(*factors)
        self.markovwriter = UAIWriter(self.markovmodel)
예제 #24
0
    def setUp(self):
        self.bayesian = BayesianModel([('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e')])
        a_cpd = TabularCPD('a', 2, [[0.4, 0.6]])
        b_cpd = TabularCPD('b', 2, [[0.2, 0.4], [0.8, 0.6]], evidence=['a'],
                           evidence_card=[2])
        c_cpd = TabularCPD('c', 2, [[0.1, 0.2], [0.9, 0.8]], evidence=['b'],
                           evidence_card=[2])
        d_cpd = TabularCPD('d', 2, [[0.4, 0.3], [0.6, 0.7]], evidence=['c'],
                           evidence_card=[2])
        e_cpd = TabularCPD('e', 2, [[0.3, 0.2], [0.7, 0.8]], evidence=['d'],
                           evidence_card=[2])
        self.bayesian.add_cpds(a_cpd, b_cpd, c_cpd, d_cpd, e_cpd)

        self.markov = MarkovModel([('a', 'b'), ('b', 'd'), ('a', 'c'), ('c', 'd')])
        factor_1 = DiscreteFactor(['a', 'b'], [2, 2], np.array([100, 1, 1, 100]))
        factor_2 = DiscreteFactor(['a', 'c'], [2, 2], np.array([40, 30, 100, 20]))
        factor_3 = DiscreteFactor(['b', 'd'], [2, 2], np.array([1, 100, 100, 1]))
        factor_4 = DiscreteFactor(['c', 'd'], [2, 2], np.array([60, 60, 40, 40]))
        self.markov.add_factors(factor_1, factor_2, factor_3, factor_4)
예제 #25
0
 def setUp(self):
     self.network = DynamicBayesianNetwork()
     self.grade_cpd = TabularCPD(('G', 0),
                                 3,
                                 values=[[0.3, 0.05, 0.8, 0.5],
                                         [0.4, 0.25, 0.1, 0.3],
                                         [0.3, 0.7, 0.1, 0.2]],
                                 evidence=[('D', 0), ('I', 0)],
                                 evidence_card=[2, 2])
     self.d_i_cpd = TabularCPD(('D', 1),
                               2,
                               values=[[0.6, 0.3], [0.4, 0.7]],
                               evidence=[('D', 0)],
                               evidence_card=[2])
     self.diff_cpd = TabularCPD(('D', 0), 2, values=[[0.6, 0.4]])
     self.intel_cpd = TabularCPD(('I', 0), 2, values=[[0.7, 0.3]])
     self.i_i_cpd = TabularCPD(('I', 1),
                               2,
                               values=[[0.5, 0.4], [0.5, 0.6]],
                               evidence=[('I', 0)],
                               evidence_card=[2])
     self.grade_1_cpd = TabularCPD(('G', 1),
                                   3,
                                   values=[[0.3, 0.05, 0.8, 0.5],
                                           [0.4, 0.25, 0.1, 0.3],
                                           [0.3, 0.7, 0.1, 0.2]],
                                   evidence=[('D', 1), ('I', 1)],
                                   evidence_card=[2, 2])
예제 #26
0
    def setUp(self):
        self.junction_tree = JunctionTree([(('A', 'B'), ('B', 'C')),
                                           (('B', 'C'), ('C', 'D'))])
        phi1 = DiscreteFactor(['A', 'B'], [2, 3], range(6))
        phi2 = DiscreteFactor(['B', 'C'], [3, 2], range(6))
        phi3 = DiscreteFactor(['C', 'D'], [2, 2], range(4))
        self.junction_tree.add_factors(phi1, phi2, phi3)

        self.bayesian_model = BayesianModel([('A', 'J'), ('R', 'J'),
                                             ('J', 'Q'), ('J', 'L'),
                                             ('G', 'L')])
        cpd_a = TabularCPD('A', 2, values=[[0.2], [0.8]])
        cpd_r = TabularCPD('R', 2, values=[[0.4], [0.6]])
        cpd_j = TabularCPD('J',
                           2,
                           values=[[0.9, 0.6, 0.7, 0.1], [0.1, 0.4, 0.3, 0.9]],
                           evidence=['A', 'R'],
                           evidence_card=[2, 2])
        cpd_q = TabularCPD('Q',
                           2,
                           values=[[0.9, 0.2], [0.1, 0.8]],
                           evidence=['J'],
                           evidence_card=[2])
        cpd_l = TabularCPD('L',
                           2,
                           values=[[0.9, 0.45, 0.8, 0.1],
                                   [0.1, 0.55, 0.2, 0.9]],
                           evidence=['J', 'G'],
                           evidence_card=[2, 2])
        cpd_g = TabularCPD('G', 2, values=[[0.6], [0.4]])
        self.bayesian_model.add_cpds(cpd_a, cpd_g, cpd_j, cpd_l, cpd_q, cpd_r)
예제 #27
0
    def setUp(self):
        # It is just a moralised version of the above Bayesian network so all the results are same. Only factors
        # are under consideration for inference so this should be fine.
        self.markov_model = MarkovModel([('A', 'J'), ('R', 'J'), ('J', 'Q'),
                                         ('J', 'L'), ('G', 'L'), ('A', 'R'),
                                         ('J', 'G')])

        factor_a = TabularCPD('A', 2, values=[[0.2], [0.8]]).to_factor()
        factor_r = TabularCPD('R', 2, values=[[0.4], [0.6]]).to_factor()
        factor_j = TabularCPD('J',
                              2,
                              values=[[0.9, 0.6, 0.7, 0.1],
                                      [0.1, 0.4, 0.3, 0.9]],
                              evidence=['A', 'R'],
                              evidence_card=[2, 2]).to_factor()
        factor_q = TabularCPD('Q',
                              2,
                              values=[[0.9, 0.2], [0.1, 0.8]],
                              evidence=['J'],
                              evidence_card=[2]).to_factor()
        factor_l = TabularCPD('L',
                              2,
                              values=[[0.9, 0.45, 0.8, 0.1],
                                      [0.1, 0.55, 0.2, 0.9]],
                              evidence=['J', 'G'],
                              evidence_card=[2, 2]).to_factor()
        factor_g = TabularCPD('G', 2, [[0.6], [0.4]]).to_factor()

        self.markov_model.add_factors(factor_a, factor_r, factor_j, factor_q,
                                      factor_l, factor_g)
        self.markov_inference = VariableElimination(self.markov_model)
예제 #28
0
    def setUp(self):
        self.bayesian_model = BayesianModel([('A', 'J'), ('R', 'J'),
                                             ('J', 'Q'), ('J', 'L'),
                                             ('G', 'L')])
        cpd_a = TabularCPD('A', 2, values=[[0.2], [0.8]])
        cpd_r = TabularCPD('R', 2, values=[[0.4], [0.6]])
        cpd_j = TabularCPD('J',
                           2,
                           values=[[0.9, 0.6, 0.7, 0.1], [0.1, 0.4, 0.3, 0.9]],
                           evidence=['A', 'R'],
                           evidence_card=[2, 2])
        cpd_q = TabularCPD('Q',
                           2,
                           values=[[0.9, 0.2], [0.1, 0.8]],
                           evidence=['J'],
                           evidence_card=[2])
        cpd_l = TabularCPD('L',
                           2,
                           values=[[0.9, 0.45, 0.8, 0.1],
                                   [0.1, 0.55, 0.2, 0.9]],
                           evidence=['J', 'G'],
                           evidence_card=[2, 2])
        cpd_g = TabularCPD('G', 2, values=[[0.6], [0.4]])
        self.bayesian_model.add_cpds(cpd_a, cpd_g, cpd_j, cpd_l, cpd_q, cpd_r)

        self.bayesian_inference = VariableElimination(self.bayesian_model)
예제 #29
0
    def test_copy(self):
        self.network.add_edges_from([
            (('D', 0), ('G', 0)), (('I', 0), ('G', 0)), (('D', 0), ('D', 1)),
            (('I', 0), ('I', 1))
        ])
        cpd = TabularCPD(('G', 0),
                         3,
                         values=[[0.3, 0.05, 0.8, 0.5], [0.4, 0.25, 0.1, 0.3],
                                 [0.3, 0.7, 0.1, 0.2]],
                         evidence=[('D', 0), ('I', 0)],
                         evidence_card=[2, 2])
        self.network.add_cpds(cpd)
        copy = self.network.copy()
        self.assertIsInstance(copy, DynamicBayesianNetwork)
        self.assertListEqual(sorted(self.network.nodes()),
                             sorted(copy.nodes()))
        self.assertListEqual(sorted(self.network.edges()),
                             sorted(copy.edges()))
        self.assertListEqual(self.network.get_cpds(), copy.get_cpds())
        self.assertListEqual(sorted(self.network.get_intra_edges()),
                             sorted(copy.get_intra_edges()))
        self.assertListEqual(sorted(self.network.get_inter_edges()),
                             sorted(copy.get_inter_edges()))
        self.assertListEqual(sorted(self.network.get_slice_nodes()),
                             sorted(copy.get_slice_nodes()))

        copy.cpds[0].values = np.array([[0.4, 0.05, 0.3, 0.5],
                                        [0.3, 0.25, 0.5, 0.3],
                                        [0.3, 0.7, 0.2, 0.2]])
        self.assertNotEqual(self.network.get_cpds(), copy.get_cpds())
        self.network.add_cpds(self.i_i_cpd, self.d_i_cpd)

        copy.add_cpds(self.diff_cpd, self.intel_cpd)
        self.network.add_node('A')
        copy.add_node('Z')
        self.network.add_edge(('A', 0), ('D', 0))
        copy.add_edge(('Z', 0), ('D', 0))
        self.assertNotEqual(sorted(self.network.nodes()), sorted(copy.nodes()))
        self.assertNotEqual(sorted(self.network.edges()), sorted(copy.edges()))
        self.assertNotEqual(self.network.get_cpds(), copy.get_cpds())
        self.assertNotEqual(sorted(self.network.get_intra_edges()),
                            sorted(copy.get_intra_edges()))
        self.assertListEqual(sorted(self.network.get_inter_edges()),
                             sorted(copy.get_inter_edges()))
        self.assertNotEqual(sorted(self.network.get_slice_nodes()),
                            sorted(copy.get_slice_nodes()))

        self.network.add_edge(('A', 0), ('D', 1))
        copy.add_edge(('Z', 0), ('D', 1))
        self.assertNotEqual(sorted(self.network.get_inter_edges()),
                            sorted(copy.get_inter_edges()))
예제 #30
0
    def get_model(self):
        """
        Returns the model instance of the ProbModel.

        Return
        ---------------
        model: an instance of BayesianModel.

        Examples
        -------
        >>> reader = ProbModelXMLReader()
        >>> reader.get_model()
        """
        if self.probnet.get('type') == "BayesianNetwork":
            model = BayesianModel(self.probnet['edges'].keys())

            tabular_cpds = []
            cpds = self.probnet['Potentials']
            for cpd in cpds:
                var = list(cpd['Variables'].keys())[0]
                states = self.probnet['Variables'][var]['States']
                evidence = cpd['Variables'][var]
                evidence_card = [
                    len(self.probnet['Variables'][evidence_var]['States'])
                    for evidence_var in evidence
                ]
                arr = list(map(float, cpd['Values'].split()))
                values = np.array(arr)
                values = values.reshape(
                    (len(states), values.size // len(states)))
                tabular_cpds.append(
                    TabularCPD(var, len(states), values, evidence,
                               evidence_card))

            model.add_cpds(*tabular_cpds)

            variables = model.nodes()
            for var in variables:
                for prop_name, prop_value in self.probnet['Variables'][
                        var].items():
                    model.node[var][prop_name] = prop_value

            edges = model.edges()
            for edge in edges:
                for prop_name, prop_value in self.probnet['edges'][edge].items(
                ):
                    model.edge[edge[0]][edge[1]][prop_name] = prop_value
            return model
        else:
            raise ValueError("Please specify only Bayesian Network.")