def test_ep_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.50001, ('diff', ): 0.49999}) f.connect(theta) f.connect(X, parent=False) f.connect(D) # Add nodes to lbp. lbp = LBP(strategy='tree') lbp.add_nodes([f, X, D, theta]) for i in range(50): lbp.run() #print theta.alpha.pretty_print(precision=5) lbp.init_messages() print theta.alpha.pretty_print(precision=5)
def test_ep_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.50001, ('diff',): 0.49999}) f.connect(theta) f.connect(X, parent=False) f.connect(D) # Add nodes to lbp. lbp = LBP(strategy='tree') lbp.add_nodes([ f, X, D, theta ]) for i in range(50): lbp.run() #print theta.alpha.pretty_print(precision=5) lbp.init_messages()
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
def test_observed_complex(self): s1 = DiscreteVariableNode('s1', ['a', 'b']) s2 = DiscreteVariableNode('s2', ['a', 'b']) f = DiscreteFactorNode('f', Factor( ['s1', 's2'], { 's1': ['a', 'b'], 's2': ['a', 'b'], }, { ('a', 'a'): 1, ('a', 'b'): 0.5, ('b', 'a'): 0, ('b', 'b'): 0.5 })) s1.connect(f) s2.connect(f) s2.observed({ ('a',): 0.7, ('b',): 0.3 }) s1.send_messages() s2.send_messages() f.update() f.normalize() f.send_messages() s1.update() s1.normalize() self.assertClose(s1.belief[('a',)], 0.85) self.assertClose(s1.belief[('b',)], 0.15) self.assertClose(s2.belief[('a',)], 0.7)
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) print theta.alpha theta.message_to(f) X.observed({('same',): 0.5, ('diff',): 0.7}) X.message_to(f) f.update() f.message_to(theta) print theta.alpha
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)
def test_network(self): # Create network. hid = DiscreteVariableNode("hid", ["save", "del"]) obs = DiscreteVariableNode("obs", ["osave", "odel"]) fact_h1_o1 = DiscreteFactorNode("fact_h1_o1", Factor( ['hid', 'obs'], { "hid": ["save", "del"], "obs": ["osave", "odel"] }, { ("save", "osave"): 0.3, ("save", "odel"): 0.6, ("del", "osave"): 0.7, ("del", "odel"): 0.4 })) # Add edges. obs.connect(fact_h1_o1) fact_h1_o1.connect(hid) # 1. Without observations, send_messages used. obs.send_messages() fact_h1_o1.send_messages() hid.update() hid.normalize() self.assertClose(hid.belief[("save",)], 0.45) # 2. Observed value, message_to and update_belief used. obs.observed({("osave",): 1}) obs.message_to(fact_h1_o1) fact_h1_o1.update() fact_h1_o1.message_to(hid) hid.update() hid.normalize() self.assertClose(hid.belief[("save",)], 0.3) # 3. Without observations, send_messages used. obs.observed(None) obs.send_messages() fact_h1_o1.send_messages() hid.update() hid.normalize() self.assertClose(hid.belief[("save",)], 0.45)
def test_layers(self): f_h_o = { ("save", "osave"): 0.8, ("del", "osave"): 0.2, ("save", "odel"): 0.2, ("del", "odel"): 0.8, } f_h_h = { ("save", "save"): 0.9, ("del", "save"): 0.1, ("save", "del"): 0.1, ("del", "del"): 0.9 } # Create nodes. hid1 = DiscreteVariableNode("hid1", ["save", "del"]) obs1 = DiscreteVariableNode("obs1", ["osave", "odel"]) fact_h1_o1 = DiscreteFactorNode( "fact_h1_o1", Factor(['hid1', 'obs1'], { "hid1": ["save", "del"], "obs1": ["osave", "odel"] }, f_h_o)) hid2 = DiscreteVariableNode("hid2", ["save", "del"]) obs2 = DiscreteVariableNode("obs2", ["osave", "odel"]) fact_h2_o2 = DiscreteFactorNode( "fact_h2_o2", Factor(['hid2', 'obs2'], { "hid2": ["save", "del"], "obs2": ["osave", "odel"] }, f_h_o)) fact_h1_h2 = DiscreteFactorNode( "fact_h1_h2", Factor(['hid1', 'hid2'], { "hid1": ["save", "del"], "hid2": ["save", "del"], }, f_h_h)) hid3 = DiscreteVariableNode("hid3", ["save", "del"]) obs3 = DiscreteVariableNode("obs3", ["osave", "odel"]) fact_h3_o3 = DiscreteFactorNode( "fact_h3_o3", Factor(['hid3', 'obs3'], { "hid3": ["save", "del"], "obs3": ["osave", "odel"] }, f_h_o)) fact_h2_h3 = DiscreteFactorNode( "fact_h2_h3", Factor(['hid2', 'hid3'], { "hid2": ["save", "del"], "hid3": ["save", "del"], }, f_h_h)) # Connect nodes. obs1.connect(fact_h1_o1) obs2.connect(fact_h2_o2) obs3.connect(fact_h3_o3) fact_h1_o1.connect(hid1) fact_h2_o2.connect(hid2) fact_h3_o3.connect(hid3) hid1.connect(fact_h1_h2) hid2.connect(fact_h1_h2) hid2.connect(fact_h2_h3) hid3.connect(fact_h2_h3) # Set observations. obs1.observed({('osave', ): 1}) # Add nodes to lbp. lbp = LBP(strategy='layers') lbp.add_layers([ [obs1, hid1, fact_h1_o1], [obs2, hid2, fact_h2_o2, fact_h1_h2], [obs3, hid3, fact_h3_o3, fact_h2_h3], ]) lbp.run() self.assertAlmostEqual(hid1.belief[('save', )], 0.8) self.assertAlmostEqual(hid2.belief[('save', )], 0.8 * 0.9 + 0.2 * 0.1, places=6) # @DM: The original test that fails at my computer. # self.assertAlmostEqual(hid3.belief[('save',)], hid2.belief[('save',)] * 0.9 + hid2.belief[('del',)] * 0.1) # MK: This one passes. self.assertAlmostEqual(hid3.belief[('save', )], hid2.belief[('save', )] * 0.9 + hid2.belief[('del', )] * 0.1, places=6) lbp = LBP(strategy='layers') lbp.add_layers([[obs1, hid1, fact_h1_o1]]) lbp.run() self.assertAlmostEqual(hid1.belief[('save', )], 0.8) lbp.add_layer([obs2, hid2, fact_h2_o2, fact_h1_h2]) lbp.run(from_layer=0) self.assertAlmostEqual(hid2.belief[('save', )], 0.8 * 0.9 + 0.2 * 0.1, places=6) lbp.add_layers([[obs3, hid3, fact_h3_o3, fact_h2_h3]]) lbp.run(from_layer='last') self.assertAlmostEqual( hid3.belief[('save', )], hid2.belief[('save', )] * 0.9 + hid2.belief[('del', )] * 0.1)
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)
def test_network(self): # Create network. hid = DiscreteVariableNode("hid", ["save", "del"]) obs = DiscreteVariableNode("obs", ["osave", "odel"]) fact_h1_o1 = DiscreteFactorNode( "fact_h1_o1", Factor(['hid', 'obs'], { "hid": ["save", "del"], "obs": ["osave", "odel"] }, { ("save", "osave"): 0.3, ("save", "odel"): 0.6, ("del", "osave"): 0.7, ("del", "odel"): 0.4 })) # Add edges. obs.connect(fact_h1_o1) fact_h1_o1.connect(hid) # 1. Without observations, send_messages used. obs.send_messages() fact_h1_o1.send_messages() hid.update() hid.normalize() self.assertClose(hid.belief[("save", )], 0.45) # 2. Observed value, message_to and update_belief used. obs.observed({("osave", ): 1}) obs.message_to(fact_h1_o1) fact_h1_o1.update() fact_h1_o1.message_to(hid) hid.update() hid.normalize() self.assertClose(hid.belief[("save", )], 0.3) # 3. Without observations, send_messages used. obs.observed(None) obs.send_messages() fact_h1_o1.send_messages() hid.update() hid.normalize() self.assertClose(hid.belief[("save", )], 0.45)
def test_ep(self): # Create nodes. hid1 = DiscreteVariableNode("hid1", ["save", "del"]) obs1 = DiscreteVariableNode("obs1", ["osave", "odel"]) fact_h1_o1 = DirichletFactorNode("fact_h1_o1") theta_h1_o1 = DirichletParameterNode('theta_h1_o1', Factor( ['hid1', 'obs1'], { "hid1": ["save", "del"], "obs1": ["osave", "odel"] }, { ("save", "osave"): 1, ("save", "odel"): 1, ("del", "osave"): 1, ("del", "odel"): 1, })) hid2 = DiscreteVariableNode("hid2", ["save", "del"]) obs2 = DiscreteVariableNode("obs2", ["osave", "odel"]) fact_h2_o2 = DirichletFactorNode("fact_h2_o2") theta_h2_o2 = DirichletParameterNode('theta_h2_o2', Factor( ['hid2', 'obs2'], { "hid2": ["save", "del"], "obs2": ["osave", "odel"] }, { ("save", "osave"): 1, ("save", "odel"): 1, ("del", "osave"): 1, ("del", "odel"): 1, })) fact_h1_h2 = DiscreteFactorNode("fact_h1_h2", Factor( ['hid1', 'hid2'], { "hid1": ["save", "del"], "hid2": ["save", "del"], }, { ("save", "save"): 0.9, ("save", "del"): 0.1, ("del", "save"): 0, ("del", "del"): 1 })) # Connect nodes. obs1.connect(fact_h1_o1, parent=False) fact_h1_o1.connect(hid1) fact_h1_o1.connect(theta_h1_o1) obs2.connect(fact_h2_o2, parent=False) fact_h2_o2.connect(hid2) fact_h2_o2.connect(theta_h2_o2) hid1.connect(fact_h1_h2) hid2.connect(fact_h1_h2) # Add nodes to lbp. lbp = LBP(strategy='tree') lbp.add_nodes([ obs1, obs2, fact_h1_o1, fact_h2_o2, theta_h1_o1, theta_h2_o2, hid1, hid2, fact_h1_h2 ]) obs1.observed({('osave',): 1}) obs2.observed({('osave',): 1}) hid1.observed({('save',): 1}) hid2.observed({('save',): 1}) for i in range(100): lbp.run() #print theta_h1_o1.alpha.pretty_print(precision=5) lbp.init_messages()
def test_layers(self): f_h_o = { ("save", "osave"): 0.8, ("del", "osave"): 0.2, ("save", "odel"): 0.2, ("del", "odel"): 0.8, } f_h_h = { ("save", "save"): 0.9, ("del", "save"): 0.1, ("save", "del"): 0.1, ("del", "del"): 0.9 } # Create nodes. hid1 = DiscreteVariableNode("hid1", ["save", "del"]) obs1 = DiscreteVariableNode("obs1", ["osave", "odel"]) fact_h1_o1 = DiscreteFactorNode("fact_h1_o1", Factor( ['hid1', 'obs1'], { "hid1": ["save", "del"], "obs1": ["osave", "odel"] }, f_h_o)) hid2 = DiscreteVariableNode("hid2", ["save", "del"]) obs2 = DiscreteVariableNode("obs2", ["osave", "odel"]) fact_h2_o2 = DiscreteFactorNode("fact_h2_o2", Factor( ['hid2', 'obs2'], { "hid2": ["save", "del"], "obs2": ["osave", "odel"] }, f_h_o)) fact_h1_h2 = DiscreteFactorNode("fact_h1_h2", Factor( ['hid1', 'hid2'], { "hid1": ["save", "del"], "hid2": ["save", "del"], }, f_h_h)) hid3 = DiscreteVariableNode("hid3", ["save", "del"]) obs3 = DiscreteVariableNode("obs3", ["osave", "odel"]) fact_h3_o3 = DiscreteFactorNode("fact_h3_o3", Factor( ['hid3', 'obs3'], { "hid3": ["save", "del"], "obs3": ["osave", "odel"] }, f_h_o)) fact_h2_h3 = DiscreteFactorNode("fact_h2_h3", Factor( ['hid2', 'hid3'], { "hid2": ["save", "del"], "hid3": ["save", "del"], }, f_h_h)) # Connect nodes. obs1.connect(fact_h1_o1) obs2.connect(fact_h2_o2) obs3.connect(fact_h3_o3) fact_h1_o1.connect(hid1) fact_h2_o2.connect(hid2) fact_h3_o3.connect(hid3) hid1.connect(fact_h1_h2) hid2.connect(fact_h1_h2) hid2.connect(fact_h2_h3) hid3.connect(fact_h2_h3) # Set observations. obs1.observed({('osave',): 1}) # Add nodes to lbp. lbp = LBP(strategy='layers') lbp.add_layers([ [obs1, hid1, fact_h1_o1], [obs2, hid2, fact_h2_o2, fact_h1_h2], [obs3, hid3, fact_h3_o3, fact_h2_h3], ]) lbp.run() self.assertAlmostEqual(hid1.belief[('save',)], 0.8) self.assertAlmostEqual(hid2.belief[('save',)], 0.8 * 0.9 + 0.2 * 0.1, places=6) # @DM: The original test that fails at my computer. # self.assertAlmostEqual(hid3.belief[('save',)], hid2.belief[('save',)] * 0.9 + hid2.belief[('del',)] * 0.1) # MK: This one passes. self.assertAlmostEqual( hid3.belief[('save',)], hid2.belief[('save',)] * 0.9 + hid2.belief[('del',)] * 0.1, places=6) lbp = LBP(strategy='layers') lbp.add_layers([ [obs1, hid1, fact_h1_o1] ]) lbp.run() self.assertAlmostEqual(hid1.belief[('save',)], 0.8) lbp.add_layer([obs2, hid2, fact_h2_o2, fact_h1_h2]) lbp.run(from_layer=0) self.assertAlmostEqual(hid2.belief[('save',)], 0.8 * 0.9 + 0.2 * 0.1, places=6) lbp.add_layers([ [obs3, hid3, fact_h3_o3, fact_h2_h3] ]) lbp.run(from_layer='last') self.assertAlmostEqual(hid3.belief[('save',)], hid2.belief[('save',)] * 0.9 + hid2.belief[('del',)] * 0.1)
def test_network(self): # Create nodes. hid1 = DiscreteVariableNode("hid1", ["save", "del"]) obs1 = DiscreteVariableNode("obs1", ["osave", "odel"]) fact_h1_o1 = DiscreteFactorNode("fact_h1_o1", Factor( ['hid1', 'obs1'], { "hid1": ["save", "del"], "obs1": ["osave", "odel"] }, { ("save", "osave"): 0.8, ("save", "odel"): 0.3, ("del", "osave"): 0.2, ("del", "odel"): 0.7, })) hid2 = DiscreteVariableNode("hid2", ["save", "del"]) obs2 = DiscreteVariableNode("obs2", ["osave", "odel"]) fact_h2_o2 = DiscreteFactorNode("fact_h2_o2", Factor( ['hid2', 'obs2'], { "hid2": ["save", "del"], "obs2": ["osave", "odel"] }, { ("save", "osave"): 0.8, ("save", "odel"): 0.2, ("del", "osave"): 0.2, ("del", "odel"): 0.8, })) fact_h1_h2 = DiscreteFactorNode("fact_h1_h2", Factor( ['hid1', 'hid2'], { "hid1": ["save", "del"], "hid2": ["save", "del"], }, { ("save", "save"): 0.9, ("save", "del"): 0.1, ("del", "save"): 0, ("del", "del"): 1 })) # Connect nodes. obs1.connect(fact_h1_o1) fact_h1_o1.connect(hid1) obs2.connect(fact_h2_o2) fact_h2_o2.connect(hid2) hid1.connect(fact_h1_h2) hid2.connect(fact_h1_h2) # Add nodes to lbp. lbp = LBP() lbp.add_nodes([ obs1, fact_h1_o1, hid1, obs2, fact_h2_o2, hid2, fact_h1_h2 ]) obs1.observed({('osave',): 1}) lbp.run(n_iterations=1) self.assertAlmostEqual(hid1.belief[('save',)], 0.8) obs2.observed({('odel',): 1}) lbp.run(n_iterations=1) self.assertAlmostEqual(hid1.belief[('save',)], 0.56521738)
def test_single_linked(self): f_h_o = { ("save", "osave"): 0.8, ("del", "osave"): 0.2, ("save", "odel"): 0.2, ("del", "odel"): 0.8, } f_h_h = { ("save", "save"): 0.9, ("del", "save"): 0.1, ("save", "del"): 0.1, ("del", "del"): 0.9 } # Create nodes. hid1 = DiscreteVariableNode("hid1", ["save", "del"]) obs1 = DiscreteVariableNode("obs1", ["osave", "odel"]) fact_h1_o1 = DiscreteFactorNode( "fact_h1_o1", Factor(['hid1', 'obs1'], { "hid1": ["save", "del"], "obs1": ["osave", "odel"] }, f_h_o)) hid2 = DiscreteVariableNode("hid2", ["save", "del"]) obs2 = DiscreteVariableNode("obs2", ["osave", "odel"]) fact_h2_o2 = DiscreteFactorNode( "fact_h2_o2", Factor(['hid2', 'obs2'], { "hid2": ["save", "del"], "obs2": ["osave", "odel"] }, f_h_o)) fact_h1_h2 = DiscreteFactorNode( "fact_h1_h2", Factor(['hid1', 'hid2'], { "hid1": ["save", "del"], "hid2": ["save", "del"], }, f_h_h)) hid3 = DiscreteVariableNode("hid3", ["save", "del"]) obs3 = DiscreteVariableNode("obs3", ["osave", "odel"]) fact_h3_o3 = DiscreteFactorNode( "fact_h3_o3", Factor(['hid3', 'obs3'], { "hid3": ["save", "del"], "obs3": ["osave", "odel"] }, f_h_o)) fact_h2_h3 = DiscreteFactorNode( "fact_h2_h3", Factor(['hid2', 'hid3'], { "hid2": ["save", "del"], "hid3": ["save", "del"], }, f_h_h)) # Connect nodes. obs1.connect(fact_h1_o1) obs2.connect(fact_h2_o2) obs3.connect(fact_h3_o3) fact_h1_o1.connect(hid1) fact_h2_o2.connect(hid2) fact_h3_o3.connect(hid3) hid1.connect(fact_h1_h2) hid2.connect(fact_h1_h2) hid2.connect(fact_h2_h3) hid3.connect(fact_h2_h3) # Add nodes to lbp. lbp = LBP(strategy='tree') lbp.add_nodes([ obs1, obs2, obs3, fact_h1_o1, fact_h2_o2, fact_h3_o3, hid1, hid2, hid3, fact_h1_h2, fact_h2_h3 ]) obs1.observed({('osave', ): 1}) lbp.run() self.assertAlmostEqual(hid1.belief[('save', )], 0.8) self.assertAlmostEqual(hid2.belief[('save', )], 0.8 * 0.9 + 0.2 * 0.1, places=6) self.assertAlmostEqual(hid3.belief[('save', )], hid2.belief[('save', )] * 0.9 + hid2.belief[('del', )] * 0.1, places=6)
def test_ep(self): # Create nodes. hid1 = DiscreteVariableNode("hid1", ["save", "del"]) obs1 = DiscreteVariableNode("obs1", ["osave", "odel"]) fact_h1_o1 = DirichletFactorNode("fact_h1_o1") theta_h1_o1 = DirichletParameterNode( 'theta_h1_o1', Factor(['hid1', 'obs1'], { "hid1": ["save", "del"], "obs1": ["osave", "odel"] }, { ("save", "osave"): 1, ("save", "odel"): 1, ("del", "osave"): 1, ("del", "odel"): 1, })) hid2 = DiscreteVariableNode("hid2", ["save", "del"]) obs2 = DiscreteVariableNode("obs2", ["osave", "odel"]) fact_h2_o2 = DirichletFactorNode("fact_h2_o2") theta_h2_o2 = DirichletParameterNode( 'theta_h2_o2', Factor(['hid2', 'obs2'], { "hid2": ["save", "del"], "obs2": ["osave", "odel"] }, { ("save", "osave"): 1, ("save", "odel"): 1, ("del", "osave"): 1, ("del", "odel"): 1, })) fact_h1_h2 = DiscreteFactorNode( "fact_h1_h2", Factor(['hid1', 'hid2'], { "hid1": ["save", "del"], "hid2": ["save", "del"], }, { ("save", "save"): 0.9, ("save", "del"): 0.1, ("del", "save"): 0, ("del", "del"): 1 })) # Connect nodes. obs1.connect(fact_h1_o1, parent=False) fact_h1_o1.connect(hid1) fact_h1_o1.connect(theta_h1_o1) obs2.connect(fact_h2_o2, parent=False) fact_h2_o2.connect(hid2) fact_h2_o2.connect(theta_h2_o2) hid1.connect(fact_h1_h2) hid2.connect(fact_h1_h2) # Add nodes to lbp. lbp = LBP(strategy='tree') lbp.add_nodes([ obs1, obs2, fact_h1_o1, fact_h2_o2, theta_h1_o1, theta_h2_o2, hid1, hid2, fact_h1_h2 ]) obs1.observed({('osave', ): 1}) obs2.observed({('osave', ): 1}) hid1.observed({('save', ): 1}) hid2.observed({('save', ): 1}) for i in range(100): lbp.run() print theta_h1_o1.alpha.pretty_print(precision=5) lbp.init_messages()
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)
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) alpha.message_to(factor) factor.update() factor.message_to(alpha)
def test_single_linked(self): f_h_o = { ("save", "osave"): 0.8, ("del", "osave"): 0.2, ("save", "odel"): 0.2, ("del", "odel"): 0.8, } f_h_h = { ("save", "save"): 0.9, ("del", "save"): 0.1, ("save", "del"): 0.1, ("del", "del"): 0.9 } # Create nodes. hid1 = DiscreteVariableNode("hid1", ["save", "del"]) obs1 = DiscreteVariableNode("obs1", ["osave", "odel"]) fact_h1_o1 = DiscreteFactorNode("fact_h1_o1", Factor( ['hid1', 'obs1'], { "hid1": ["save", "del"], "obs1": ["osave", "odel"] }, f_h_o)) hid2 = DiscreteVariableNode("hid2", ["save", "del"]) obs2 = DiscreteVariableNode("obs2", ["osave", "odel"]) fact_h2_o2 = DiscreteFactorNode("fact_h2_o2", Factor( ['hid2', 'obs2'], { "hid2": ["save", "del"], "obs2": ["osave", "odel"] }, f_h_o)) fact_h1_h2 = DiscreteFactorNode("fact_h1_h2", Factor( ['hid1', 'hid2'], { "hid1": ["save", "del"], "hid2": ["save", "del"], }, f_h_h)) hid3 = DiscreteVariableNode("hid3", ["save", "del"]) obs3 = DiscreteVariableNode("obs3", ["osave", "odel"]) fact_h3_o3 = DiscreteFactorNode("fact_h3_o3", Factor( ['hid3', 'obs3'], { "hid3": ["save", "del"], "obs3": ["osave", "odel"] }, f_h_o)) fact_h2_h3 = DiscreteFactorNode("fact_h2_h3", Factor( ['hid2', 'hid3'], { "hid2": ["save", "del"], "hid3": ["save", "del"], }, f_h_h)) # Connect nodes. obs1.connect(fact_h1_o1) obs2.connect(fact_h2_o2) obs3.connect(fact_h3_o3) fact_h1_o1.connect(hid1) fact_h2_o2.connect(hid2) fact_h3_o3.connect(hid3) hid1.connect(fact_h1_h2) hid2.connect(fact_h1_h2) hid2.connect(fact_h2_h3) hid3.connect(fact_h2_h3) # Add nodes to lbp. lbp = LBP(strategy='tree') lbp.add_nodes([ obs1, obs2, obs3, fact_h1_o1, fact_h2_o2, fact_h3_o3, hid1, hid2, hid3, fact_h1_h2, fact_h2_h3 ]) obs1.observed({('osave',): 1}) lbp.run() self.assertAlmostEqual(hid1.belief[('save',)], 0.8) self.assertAlmostEqual(hid2.belief[('save',)], 0.8 * 0.9 + 0.2 * 0.1, places=6) self.assertAlmostEqual(hid3.belief[('save',)], hid2.belief[('save',)] * 0.9 + hid2.belief[('del',)] * 0.1, places=6)
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)
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
def test_observed_complex(self): s1 = DiscreteVariableNode('s1', ['a', 'b']) s2 = DiscreteVariableNode('s2', ['a', 'b']) f = DiscreteFactorNode( 'f', Factor(['s1', 's2'], { 's1': ['a', 'b'], 's2': ['a', 'b'], }, { ('a', 'a'): 1, ('a', 'b'): 0.5, ('b', 'a'): 0, ('b', 'b'): 0.5 })) s1.connect(f) s2.connect(f) s2.observed({('a', ): 0.7, ('b', ): 0.3}) s1.send_messages() s2.send_messages() f.update() f.normalize() f.send_messages() s1.update() s1.normalize() self.assertClose(s1.belief[('a', )], 0.85) self.assertClose(s1.belief[('b', )], 0.15) self.assertClose(s2.belief[('a', )], 0.7)
def test_network(self): # Create nodes. hid1 = DiscreteVariableNode("hid1", ["save", "del"]) obs1 = DiscreteVariableNode("obs1", ["osave", "odel"]) fact_h1_o1 = DiscreteFactorNode( "fact_h1_o1", Factor(['hid1', 'obs1'], { "hid1": ["save", "del"], "obs1": ["osave", "odel"] }, { ("save", "osave"): 0.8, ("save", "odel"): 0.3, ("del", "osave"): 0.2, ("del", "odel"): 0.7, })) hid2 = DiscreteVariableNode("hid2", ["save", "del"]) obs2 = DiscreteVariableNode("obs2", ["osave", "odel"]) fact_h2_o2 = DiscreteFactorNode( "fact_h2_o2", Factor(['hid2', 'obs2'], { "hid2": ["save", "del"], "obs2": ["osave", "odel"] }, { ("save", "osave"): 0.8, ("save", "odel"): 0.2, ("del", "osave"): 0.2, ("del", "odel"): 0.8, })) fact_h1_h2 = DiscreteFactorNode( "fact_h1_h2", Factor(['hid1', 'hid2'], { "hid1": ["save", "del"], "hid2": ["save", "del"], }, { ("save", "save"): 0.9, ("save", "del"): 0.1, ("del", "save"): 0, ("del", "del"): 1 })) # Connect nodes. obs1.connect(fact_h1_o1) fact_h1_o1.connect(hid1) obs2.connect(fact_h2_o2) fact_h2_o2.connect(hid2) hid1.connect(fact_h1_h2) hid2.connect(fact_h1_h2) # Add nodes to lbp. lbp = LBP() lbp.add_nodes( [obs1, fact_h1_o1, hid1, obs2, fact_h2_o2, hid2, fact_h1_h2]) obs1.observed({('osave', ): 1}) lbp.run(n_iterations=1) self.assertAlmostEqual(hid1.belief[('save', )], 0.8) obs2.observed({('odel', ): 1}) lbp.run(n_iterations=1) self.assertAlmostEqual(hid1.belief[('save', )], 0.56521738)