Beispiel #1
0
    def test_marginalize(self):
        factor = Factor(
            ['A', 'B', 'C'],
            {
                "A": [0, 1],
                "B": [0, 1, 2],
                "C": [0, 1],
            },
            {
#               (A, B, C): P(A, B, C)
                (0, 0, 0): 0.01,
                (0, 0, 1): 0.02,
                (0, 1, 0): 0.03,
                (0, 1, 1): 0.04,
                (0, 2, 0): 0.05,
                (0, 2, 1): 0.05,
                (1, 0, 0): 0.06,
                (1, 0, 1): 0.07,
                (1, 1, 0): 0.08,
                (1, 1, 1): 0.09,
                (1, 2, 0): 0.1,
                (1, 2, 1): 0.4,
            })
        factor_a = factor.marginalize(["A"])
        self.assertAlmostEqual(factor_a[(0,)], 0.2)
        self.assertAlmostEqual(factor_a[(1,)], 0.8)

        factor_ac = factor.marginalize(["A", "C"])
        self.assertAlmostEqual(factor_ac[(0, 0)], 0.09)
Beispiel #2
0
 def test_expected_value_squared(self):
     alpha = Factor(
         ['X0', 'X1'],
         {
             'X0': ['x0_0', 'x0_1'],
             'X1': ['x1_0', 'x1_1'],
         },
         {
             ('x0_0', 'x1_0'): 8,
             ('x0_0', 'x1_1'): 1,
             ('x0_1', 'x1_0'): 2,
             ('x0_1', 'x1_1'): 1,
         }
     )
     sum_of_alphas = alpha.marginalize(['X1'])
     expected_value_squared = alpha * (alpha + 1) / (sum_of_alphas * (sum_of_alphas + 1))
     self.assertAlmostEqual(expected_value_squared[('x0_0', 'x1_0')], 72.0/110)
     self.assertAlmostEqual(expected_value_squared[('x0_0', 'x1_1')], 1.0/3)
     self.assertAlmostEqual(expected_value_squared[('x0_1', 'x1_0')], 6.0/110)
     self.assertAlmostEqual(expected_value_squared[('x0_1', 'x1_1')], 1.0/3)
Beispiel #3
0
    def test_alphas(self):
        alpha = Factor(
            ['X0', 'X1', 'X2', 'X3'],
            {
                'X0': ['x0_0', 'x0_1'],
                'X1': ['x1_0', 'x1_1'],
                'X2': ['x2_0', 'x2_1'],
                'X3': ['x3_0', 'x3_1'],
            },
            {
                ('x0_0', 'x1_0', 'x2_0', 'x3_0'): 1,
                ('x0_0', 'x1_0', 'x2_0', 'x3_1'): 1,
                ('x0_0', 'x1_0', 'x2_1', 'x3_0'): 1,
                ('x0_0', 'x1_0', 'x2_1', 'x3_1'): 2,
                ('x0_0', 'x1_1', 'x2_0', 'x3_0'): 5,
                ('x0_0', 'x1_1', 'x2_0', 'x3_1'): 1,
                ('x0_0', 'x1_1', 'x2_1', 'x3_0'): 3,
                ('x0_0', 'x1_1', 'x2_1', 'x3_1'): 1,
                ('x0_1', 'x1_0', 'x2_0', 'x3_0'): 1,
                ('x0_1', 'x1_0', 'x2_0', 'x3_1'): 1,
                ('x0_1', 'x1_0', 'x2_1', 'x3_0'): 1,
                ('x0_1', 'x1_0', 'x2_1', 'x3_1'): 1,
                ('x0_1', 'x1_1', 'x2_0', 'x3_0'): 1,
                ('x0_1', 'x1_1', 'x2_0', 'x3_1'): 1,
                ('x0_1', 'x1_1', 'x2_1', 'x3_0'): 1,
                ('x0_1', 'x1_1', 'x2_1', 'x3_1'): 1,
            })

        X0 = Factor(
            ['X0'],
            {
                'X0': ['x0_0', 'x0_1']
            },
            {
                ('x0_0',): 1,
                ('x0_1',): 0,
            })

        X1 = Factor(
            ['X1'],
            {
                'X1': ['x1_0', 'x1_1']
            },
            {
                ('x1_0',): 0,
                ('x1_1',): 1,
            })

        X2 = Factor(
            ['X2'],
            {
                'X2': ['x2_0', 'x2_1']
            },
            {
                ('x2_0',): 1,
                ('x2_1',): 0,
            })

        X3 = Factor(
            ['X3'],
            {
                'X3': ['x3_0', 'x3_1']
            },
            {
                ('x3_0',): 1,
                ('x3_1',): 0,
            })

        # Compute message to X1.

        cavity = X0 * X2 * X3
        self.assertAlmostEqual(cavity[('x0_0', 'x2_0', 'x3_0')], 1.0)

        sum_of_alphas = alpha.marginalize(['X1', 'X2', 'X3'])
        self.assertAlmostEqual(sum_of_alphas[('x1_1', 'x2_0', 'x3_0')], 6)

        expected_value = alpha / sum_of_alphas
        self.assertAlmostEqual(expected_value[('x0_0', 'x1_1', 'x2_1', 'x3_0')], 0.75)

        factor = cavity * expected_value
        self.assertAlmostEqual(factor[('x0_0', 'x1_1', 'x2_0', 'x3_0')], 5.0/6)

        msg = factor.marginalize(['X1'])
        self.assertAlmostEqual(msg[('x1_0',)], 0.5)

        # Compute message to X0.

        cavity = X1 * X2 * X3
        self.assertAlmostEqual(cavity[('x1_1', 'x2_0', 'x3_0')], 1.0)
        self.assertAlmostEqual(cavity[('x1_0', 'x2_0', 'x3_0')], 0.0)

        sum_of_alphas = alpha.marginalize(['X1', 'X2', 'X3'])

        expected_value = alpha / sum_of_alphas
        self.assertAlmostEqual(expected_value[('x0_0', 'x1_1', 'x2_0', 'x3_1')], 0.5)

        factor = cavity * expected_value

        msg = factor.marginalize(['X0'])
        self.assertAlmostEqual(msg[('x0_0',)], 5.0/6)

        # Compute w_0.

        sum_of_alphas = alpha.marginalize(['X1', 'X2', 'X3'])
        expected_value = alpha / sum_of_alphas
        belief = X0 * X1 * X2 * X3
        factor = belief * expected_value
        msg = factor.marginalize(['X1', 'X2', 'X3'])
        w0 = msg.sum_other()
        self.assertAlmostEqual(w0[('x1_0', 'x2_0', 'x3_0')], 5.0/6)

        # Compute w_k.

        # When we want to compute w_k for each j, we can just compute the belief.
        # Each j is denoted by an assignment of parents, which in this case is
        # the assignment of X1, X2, X3, and each k is a value of a child, in
        # this case it's the value of X0.
        # For given j and k, we can get the value of w_jk, by getting one row
        # from w_k.
        w_k = X0 * X1 * X2 * X3
        self.assertAlmostEqual(w_k[('x0_0', 'x1_0', 'x2_0', 'x3_0')], 0)
        self.assertAlmostEqual(w_k[('x0_0', 'x1_1', 'x2_0', 'x3_0')], 1)

        # Compute expected value of p(theta)
        sum_of_alphas = alpha.marginalize(['X1', 'X2', 'X3'])
        expected_value_0 = alpha / sum_of_alphas

        sum_of_alphas_plus_1 = alpha.marginalize(['X1', 'X2', 'X3'])
        sum_of_alphas_plus_1 += 1

        expected_values = [w0 * expected_value_0]
        self.assertAlmostEqual(expected_values[0][('x0_0', 'x1_0', 'x2_0', 'x3_0')], 5.0/12)
        self.assertAlmostEqual(expected_values[0][('x0_1', 'x1_0', 'x2_0', 'x3_0')], 5.0/12)

        for k in X0.variable_values['X0']:
            new_alpha = copy.deepcopy(alpha)
            for i, item in enumerate(new_alpha):
                (assignment, value) = item
                if assignment[0] == k:
                    new_alpha[assignment] += 1
            expected_value_k = new_alpha / sum_of_alphas_plus_1
            expected_values.append(w_k * expected_value * expected_value_k)

        expected_value_sum = reduce(operator.add, expected_values)