package aima.test.core.unit.probability.bayes.approx; import org.junit.Assert; import org.junit.Test; import aima.core.probability.ProbabilityModel; import aima.core.probability.RandomVariable; import aima.core.probability.bayes.BayesianNetwork; import aima.core.probability.bayes.approx.LikelihoodWeighting; import aima.core.probability.example.BayesNetExampleFactory; import aima.core.probability.example.ExampleRV; import aima.core.probability.proposition.AssignmentProposition; import aima.core.util.MockRandomizer; /** * * @author Ciaran O'Reilly * @author Ravi Mohan */ public class LikelihoodWeightingTest { public static final double DELTA_THRESHOLD = ProbabilityModel.DEFAULT_ROUNDING_THRESHOLD; @Test public void testLikelihoodWeighting_basic() { BayesianNetwork bn = BayesNetExampleFactory .constructCloudySprinklerRainWetGrassNetwork(); AssignmentProposition[] e = new AssignmentProposition[] { new AssignmentProposition( ExampleRV.SPRINKLER_RV, Boolean.TRUE) }; MockRandomizer r = new MockRandomizer( new double[] { 0.5, 0.5, 0.5, 0.5 }); LikelihoodWeighting lw = new LikelihoodWeighting(r); double[] estimate = lw.likelihoodWeighting( new RandomVariable[] { ExampleRV.RAIN_RV }, e, bn, 1000) .getValues(); Assert.assertArrayEquals(new double[] { 1.0, 0.0 }, estimate, DELTA_THRESHOLD); } @Test public void testLikelihoodWeighting_AIMA3e_pg533() { // AIMA3e pg. 533 // <b>P</b>(Rain | Cloudy = true, WetGrass = true) BayesianNetwork bn = BayesNetExampleFactory .constructCloudySprinklerRainWetGrassNetwork(); AssignmentProposition[] e = new AssignmentProposition[] { new AssignmentProposition(ExampleRV.CLOUDY_RV, Boolean.TRUE), new AssignmentProposition(ExampleRV.WET_GRASS_RV, Boolean.TRUE) }; // sample P(Sprinkler | Cloudy = true) = <0.1, 0.9>; suppose // Sprinkler=false // sample P(Rain | Cloudy = true) = <0.8, 0.2>; suppose Rain=true MockRandomizer r = new MockRandomizer(new double[] { 0.5, 0.5 }); LikelihoodWeighting lw = new LikelihoodWeighting(r); double[] estimate = lw.likelihoodWeighting( new RandomVariable[] { ExampleRV.RAIN_RV }, e, bn, 1) .getValues(); // Here the event [true,false,true,true] should have weight 0.45, // and this is tallied under Rain = true, which when normalized // should be <1.0, 0.0>; Assert.assertArrayEquals(new double[] { 1.0, 0.0 }, estimate, DELTA_THRESHOLD); } }