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)
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)
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)