예제 #1
0
    def test_parameter_simple(self):
        alpha = DirichletParameterNode(
            'theta',
            Factor(['X0', 'X1'], {
                'X0': ['x0_0', 'x0_1'],
                'X1': ['x1_0'],
            }, {
                ('x0_0', 'x1_0'): 3,
                ('x0_1', 'x1_0'): 1,
            }))

        factor = DirichletFactorNode('factor')
        x0 = DiscreteVariableNode('X0', ['x0_0', 'x0_1'])
        x1 = DiscreteVariableNode('X1', ['x1_0'])

        x1.observed({('x1_0', ): 1})

        factor.connect(alpha)
        factor.connect(x0, parent=False)
        factor.connect(x1, parent=True)

        x0.message_to(factor)
        x1.message_to(factor)

        factor.update()
        self.assertAlmostEqual(factor.belief[('x0_0', 'x1_0')], 0.5)

        factor.message_to(x0)
        factor.message_to(x1)

        x0.update()
        self.assertAlmostEqual(x0.belief[('x0_0', )], 3.0 / 4)

        factor.message_to(alpha)
예제 #2
0
    def test_dir_tight(self):
        theta = DirichletParameterNode(
            'theta',
            Factor(['X', 'ZDummy'], {
                'X': ['same', 'diff'],
                'ZDummy': ['dummy']
            }, {
                ('same', 'dummy'): 1,
                ('diff', 'dummy'): 1,
            },
                   logarithmetic=False))

        X = DiscreteVariableNode('X', ['same', 'diff'], logarithmetic=False)
        D = DiscreteVariableNode('ZDummy', ['dummy'], logarithmetic=False)
        f = DirichletFactorNode('f')

        X.observed({('same', ): 0.8, ('diff', ): 0.2})

        f.connect(theta)
        f.connect(X, parent=False)
        f.connect(D)

        X.message_to(f)
        D.message_to(f)
        f.update()
        f.message_to(theta)

        theta.message_to(f)

        X.observed({('same', ): 0.5, ('diff', ): 0.7})
        X.message_to(f)
        f.update()
        f.message_to(theta)
예제 #3
0
파일: test_node.py 프로젝트: UFAL-DSG/alex
    def test_dir_tight(self):
        theta = DirichletParameterNode('theta', Factor(
            ['X', 'ZDummy'],
            {
                'X': ['same', 'diff'],
                'ZDummy': ['dummy']
            },
            {
                ('same', 'dummy'): 1,
                ('diff', 'dummy'): 1,
            },
            logarithmetic=False
        ))

        X = DiscreteVariableNode('X', ['same', 'diff'], logarithmetic=False)
        D = DiscreteVariableNode('ZDummy', ['dummy'], logarithmetic=False)
        f = DirichletFactorNode('f')

        X.observed({('same',): 0.8, ('diff',): 0.2})

        f.connect(theta)
        f.connect(X, parent=False)
        f.connect(D)

        X.message_to(f)
        D.message_to(f)
        f.update()
        f.message_to(theta)

        theta.message_to(f)

        X.observed({('same',): 0.5, ('diff',): 0.7})
        X.message_to(f)
        f.update()
        f.message_to(theta)
예제 #4
0
    def test_two_factors_one_theta2(self):
        alpha = DirichletParameterNode(
            'theta',
            Factor(['X0', 'X1'], {
                'X0': ['x0_0', 'x0_1'],
                'X1': ['x1_0', 'x1_1', 'x1_2'],
            }, {
                ('x0_0', 'x1_0'): 1,
                ('x0_0', 'x1_1'): 8,
                ('x0_0', 'x1_2'): 1,
                ('x0_1', 'x1_0'): 1,
                ('x0_1', 'x1_1'): 2,
                ('x0_1', 'x1_2'): 1,
            }))

        f1 = DirichletFactorNode('f1', aliases={'X0': 'X0_a', 'X1': 'X1_a'})
        x0 = DiscreteVariableNode('X0_a', ['x0_0', 'x0_1'])
        x1 = DiscreteVariableNode('X1_a', ['x1_0', 'x1_1', 'x1_2'])

        f2 = DirichletFactorNode('f2', aliases={'X0': 'X0_b', 'X1': 'X1_b'})
        x2 = DiscreteVariableNode('X0_b', ['x0_0', 'x0_1'])
        x3 = DiscreteVariableNode('X1_b', ['x1_0', 'x1_1', 'x1_2'])

        f1.connect(x0, parent=False)
        f1.connect(x1)

        f2.connect(x2, parent=False)
        f2.connect(x3)

        f1.connect(alpha)
        f2.connect(alpha)

        alpha.aliases = {
            'X0_a': 'X0',
            'X0_b': 'X0',
            'X1_a': 'X1',
            'X1_b': 'X1'
        }

        x0.observed({('x0_0', ): 1})
        x1.observed({('x1_0', ): 1})

        x2.observed({('x0_1', ): 1})
        x3.observed({('x1_0', ): 1})

        x0.message_to(f1)
        x1.message_to(f1)
        x2.message_to(f2)
        x3.message_to(f2)

        f1.update()
        f2.update()

        f1.message_to(alpha)
        f2.message_to(alpha)

        self.assertAlmostEqual(alpha.alpha[('x0_0', 'x1_0')], 2, places=5)
        self.assertAlmostEqual(alpha.alpha[('x0_1', 'x1_0')], 2, places=5)
예제 #5
0
파일: test_node.py 프로젝트: AoJ/alex
    def test_two_factors_one_theta2(self):
        alpha = DirichletParameterNode('theta', Factor(
            ['X0', 'X1'],
            {
                'X0': ['x0_0', 'x0_1'],
                'X1': ['x1_0', 'x1_1', 'x1_2'],
            },
            {
                ('x0_0', 'x1_0'): 1,
                ('x0_0', 'x1_1'): 8,
                ('x0_0', 'x1_2'): 1,
                ('x0_1', 'x1_0'): 1,
                ('x0_1', 'x1_1'): 2,
                ('x0_1', 'x1_2'): 1,
            }
        ))

        f1 = DirichletFactorNode('f1', aliases={'X0': 'X0_a', 'X1': 'X1_a'})
        x0 = DiscreteVariableNode('X0_a', ['x0_0', 'x0_1'])
        x1 = DiscreteVariableNode('X1_a', ['x1_0', 'x1_1', 'x1_2'])

        f2 = DirichletFactorNode('f2', aliases={'X0': 'X0_b', 'X1': 'X1_b'})
        x2 = DiscreteVariableNode('X0_b', ['x0_0', 'x0_1'])
        x3 = DiscreteVariableNode('X1_b', ['x1_0', 'x1_1', 'x1_2'])

        f1.connect(x0, parent=False)
        f1.connect(x1)

        f2.connect(x2, parent=False)
        f2.connect(x3)

        f1.connect(alpha)
        f2.connect(alpha)

        alpha.aliases = {'X0_a': 'X0', 'X0_b': 'X0', 'X1_a': 'X1', 'X1_b': 'X1'}

        x0.observed({('x0_0',): 1})
        x1.observed({('x1_0',): 1})

        x2.observed({('x0_1',): 1})
        x3.observed({('x1_0',): 1})

        x0.message_to(f1)
        x1.message_to(f1)
        x2.message_to(f2)
        x3.message_to(f2)

        f1.update()
        f2.update()

        f1.message_to(alpha)
        f2.message_to(alpha)

        print alpha.alpha
        self.assertAlmostEqual(alpha.alpha[('x0_0', 'x1_0')], 2, places=5)
        self.assertAlmostEqual(alpha.alpha[('x0_1', 'x1_0')], 2, places=5)
예제 #6
0
    def test_parameter(self):
        alpha = DirichletParameterNode('theta', Factor(
            ['X0', 'X1'],
            {
                'X0': ['x0_0', 'x0_1'],
                'X1': ['x1_0', 'x1_1', 'x1_2'],
            },
            {
                ('x0_0', 'x1_0'): 1,
                ('x0_0', 'x1_1'): 8,
                ('x0_0', 'x1_2'): 1,
                ('x0_1', 'x1_0'): 1,
                ('x0_1', 'x1_1'): 2,
                ('x0_1', 'x1_2'): 1,
            }
        ))

        factor = DirichletFactorNode('factor')
        x0 = DiscreteVariableNode('X0', ['x0_0', 'x0_1'])
        x1 = DiscreteVariableNode('X1', ['x1_0', 'x1_1', 'x1_2'])

        x0.observed({('x0_0',): 1})
        x1.observed({('x1_0',): 0.7, ('x1_1',): 0.2, ('x1_2',): 0.1})

        factor.connect(alpha)
        factor.connect(x0, parent=False)
        factor.connect(x1, parent=True)

        x0.message_to(factor)
        x1.message_to(factor)

        factor.update()

        factor.message_to(x0)
        factor.message_to(x1)

        x0.update()

        factor.message_to(alpha)
        print alpha.alpha

        alpha.message_to(factor)

        factor.update()
        factor.message_to(alpha)
        print alpha.alpha
예제 #7
0
파일: test_node.py 프로젝트: AoJ/alex
    def test_parameter_simple(self):
        alpha = DirichletParameterNode('theta', Factor(
            ['X0', 'X1'],
            {
                'X0': ['x0_0', 'x0_1'],
                'X1': ['x1_0'],
            },
            {
                ('x0_0', 'x1_0'): 3,
                ('x0_1', 'x1_0'): 1,
            }
        ))

        factor = DirichletFactorNode('factor')
        x0 = DiscreteVariableNode('X0', ['x0_0', 'x0_1'])
        x1 = DiscreteVariableNode('X1', ['x1_0'])

        x1.observed({('x1_0',): 1})

        factor.connect(alpha)
        factor.connect(x0, parent=False)
        factor.connect(x1, parent=True)

        x0.message_to(factor)
        x1.message_to(factor)

        factor.update()
        self.assertAlmostEqual(factor.belief[('x0_0', 'x1_0')], 0.5)

        factor.message_to(x0)
        factor.message_to(x1)

        x0.update()
        self.assertAlmostEqual(x0.belief[('x0_0',)], 3.0/4)

        factor.message_to(alpha)
        print alpha.alpha