180 lines
5.1 KiB
Java
180 lines
5.1 KiB
Java
package dkohl.bayes.example.builders;
|
|
|
|
import dkohl.bayes.bayesnet.BayesNet;
|
|
import dkohl.bayes.probability.Assignment;
|
|
import dkohl.bayes.probability.Probability;
|
|
import dkohl.bayes.probability.Variable;
|
|
import dkohl.bayes.probability.distribution.ProbabilityTable;
|
|
import dkohl.bayes.statistic.DataPoint;
|
|
import dkohl.bayes.statistic.DataSet;
|
|
|
|
/**
|
|
* The Sprinkler net example
|
|
*
|
|
* http://www.cs.ubc.ca/~murphyk/Bayes/bnintro.html
|
|
*
|
|
* @author Daniel Kohlsdorf
|
|
*/
|
|
public class EstimateSprinklerNetBuilderTable {
|
|
|
|
// Variable names
|
|
public static final String CLOUDY = "Cloudy";
|
|
public static final String SPRINKLER = "Sprinkler";
|
|
public static final String GRASS_WET = "GrassWet";
|
|
public static final String RAIN = "Rain";
|
|
|
|
// Possible outcomes
|
|
public static final String TRUE = "true";
|
|
public static final String FALSE = "false";
|
|
|
|
// A variables domain
|
|
public static final String DOMAIN[] = { TRUE, FALSE };
|
|
|
|
// A set of variables
|
|
public static final String VARIABLES[] = { CLOUDY, SPRINKLER, GRASS_WET,
|
|
RAIN };
|
|
|
|
private static void cloudy(BayesNet sprinklerNet) {
|
|
Probability p_cloudy = new Probability(0.5);
|
|
String names[] = { CLOUDY };
|
|
ProbabilityTable cloudy = new ProbabilityTable(names);
|
|
cloudy.setProbabilityForAssignment("true;", p_cloudy);
|
|
cloudy.setProbabilityForAssignment("false;", p_cloudy.rest());
|
|
sprinklerNet.setDistribution(new Variable(CLOUDY, DOMAIN), cloudy);
|
|
}
|
|
|
|
private static void rain(BayesNet sprinklerNet) {
|
|
Probability p_cloudy = new Probability(0.8);
|
|
Probability p_notcloudy = new Probability(0.2);
|
|
|
|
String names[] = { CLOUDY, RAIN };
|
|
ProbabilityTable rain = new ProbabilityTable(names);
|
|
rain.setProbabilityForAssignment("true;true;", p_cloudy);
|
|
rain.setProbabilityForAssignment("false;false;", p_notcloudy);
|
|
|
|
rain.setProbabilityForAssignment("false;true;", p_notcloudy.rest());
|
|
rain.setProbabilityForAssignment("true;false;", p_cloudy.rest());
|
|
sprinklerNet.setDistribution(new Variable(RAIN, DOMAIN), rain);
|
|
}
|
|
|
|
private static void sprinkler(BayesNet sprinklerNet) {
|
|
Probability p_cloudy = new Probability(0.1);
|
|
Probability p_notcloudy = new Probability(0.5);
|
|
|
|
String names[] = { CLOUDY, SPRINKLER };
|
|
ProbabilityTable sprinkler = new ProbabilityTable(names);
|
|
sprinkler.setProbabilityForAssignment("true;true;", p_cloudy);
|
|
sprinkler.setProbabilityForAssignment("false;false;", p_notcloudy);
|
|
|
|
sprinkler
|
|
.setProbabilityForAssignment("false;true;", p_notcloudy.rest());
|
|
sprinkler.setProbabilityForAssignment("true;false;", p_cloudy.rest());
|
|
sprinklerNet
|
|
.setDistribution(new Variable(SPRINKLER, DOMAIN), sprinkler);
|
|
}
|
|
|
|
private static void grass(BayesNet sprinklerNet) {
|
|
String names[] = { RAIN, SPRINKLER, GRASS_WET };
|
|
ProbabilityTable sprinkler = new ProbabilityTable(names);
|
|
sprinklerNet
|
|
.setDistribution(new Variable(GRASS_WET, DOMAIN), sprinkler);
|
|
}
|
|
|
|
public static BayesNet sprinkler() {
|
|
BayesNet sprinkler = new BayesNet(VARIABLES);
|
|
|
|
cloudy(sprinkler);
|
|
rain(sprinkler);
|
|
sprinkler(sprinkler);
|
|
grass(sprinkler);
|
|
|
|
sprinkler.connect(RAIN, CLOUDY);
|
|
sprinkler.connect(SPRINKLER, CLOUDY);
|
|
sprinkler.connect(GRASS_WET, RAIN);
|
|
sprinkler.connect(GRASS_WET, SPRINKLER);
|
|
|
|
return sprinkler;
|
|
}
|
|
|
|
private static Assignment build(String varible, String value) {
|
|
return new Assignment(new Variable(varible, DOMAIN), value);
|
|
}
|
|
|
|
public static DataSet dataSet() {
|
|
DataSet dataSet = new DataSet();
|
|
|
|
/**
|
|
* If rain is false and sprinkler is false, grass is never wet.
|
|
*/
|
|
DataPoint one = new DataPoint();
|
|
one.add(build(RAIN, FALSE));
|
|
one.add(build(SPRINKLER, FALSE));
|
|
one.add(build(GRASS_WET, FALSE));
|
|
dataSet.add(one);
|
|
|
|
/**
|
|
* 1 / 10 times the grass is not wet when the sprinkler is on
|
|
*/
|
|
DataPoint two = new DataPoint();
|
|
two.add(build(RAIN, FALSE));
|
|
two.add(build(SPRINKLER, TRUE));
|
|
two.add(build(GRASS_WET, FALSE));
|
|
dataSet.add(two);
|
|
|
|
/**
|
|
* 9 / 10 times the sprinkler is on and the grass is wet
|
|
*/
|
|
for (int i = 0; i < 9; i++) {
|
|
DataPoint point = new DataPoint();
|
|
point.add(build(RAIN, FALSE));
|
|
point.add(build(SPRINKLER, TRUE));
|
|
point.add(build(GRASS_WET, TRUE));
|
|
dataSet.add(point);
|
|
}
|
|
|
|
/**
|
|
* 1 / 10 times the grass is not wet when it rains
|
|
*/
|
|
DataPoint three = new DataPoint();
|
|
three.add(build(RAIN, TRUE));
|
|
three.add(build(SPRINKLER, FALSE));
|
|
three.add(build(GRASS_WET, FALSE));
|
|
dataSet.add(three);
|
|
|
|
/**
|
|
* 9 / 10 times it rains and the grass is wet
|
|
*/
|
|
for (int i = 0; i < 9; i++) {
|
|
DataPoint point = new DataPoint();
|
|
point.add(build(RAIN, TRUE));
|
|
point.add(build(SPRINKLER, FALSE));
|
|
point.add(build(GRASS_WET, TRUE));
|
|
dataSet.add(point);
|
|
}
|
|
|
|
/**
|
|
* 1 / 100 times the grass is not wet when it rains and the sprinkler is
|
|
* on
|
|
*/
|
|
DataPoint four = new DataPoint();
|
|
four.add(build(RAIN, TRUE));
|
|
four.add(build(SPRINKLER, TRUE));
|
|
four.add(build(GRASS_WET, FALSE));
|
|
dataSet.add(four);
|
|
|
|
/**
|
|
* 99 / 100 times it rains and the grass is wet
|
|
*/
|
|
for (int i = 0; i < 99; i++) {
|
|
DataPoint point = new DataPoint();
|
|
point.add(build(RAIN, TRUE));
|
|
point.add(build(SPRINKLER, TRUE));
|
|
point.add(build(GRASS_WET, TRUE));
|
|
dataSet.add(point);
|
|
}
|
|
|
|
return dataSet;
|
|
}
|
|
|
|
}
|