Hello Michael,
I just took an look an Jayes and it is realy great to use, but i think the implementation doesn't work correctly at some point.
For a test i tried to implement this bayesian network from the paper (http://www.ra.cs.uni-tuebingen.de/lehre/ss06/pro_learning/Bayesnetze_SteffenOtto.pdf)
All works fine till the last Node "Dyspnoe". if i configure this node, i have to set 8 Probabilitys after my understanding of bayesian Networks (like the Tub. Od L. Node), but Jayes expects 32 regarding this exception.
Exception in thread "main" java.lang.IllegalArgumentException: Probability table does not have expected size. Expected: 32but got: 8
at bayesian.BayesNode.setProbabilities(BayesNode.java:53)
at bayesian.Test.main(Test.java:70)
This is my whole implementation of the network:
public class Test {
public static void main(String[] args) {
BayesNet net = new BayesNet();
BayesNode asienbesuch = net.createNode("Asienbesuch");
asienbesuch.addOutcomes("yes", "no");
asienbesuch.setProbabilities(0.01, 0.99);
BayesNode raucher = net.createNode("Raucher");
raucher.addOutcomes("yes", "no");
raucher.setProbabilities(0.5, 0.5);
BayesNode tuberkulose = net.createNode("Tuberkulose");
tuberkulose.addOutcomes("yes", "no");
tuberkulose.setParents(Arrays.asList(asienbesuch));
tuberkulose.setProbabilities(//
0.05, 0.95, // asienbesuch = yes
0.01, 0.99 // asienbesuch = no
);
BayesNode lungenkrebs = net.createNode("Lungenkrebs");
lungenkrebs.addOutcomes("yes", "no");
lungenkrebs.setParents(Arrays.asList(raucher));
lungenkrebs.setProbabilities(//
0.1, 0.9, // raucher = yes
0.01, 0.99 // raucher = no
);
BayesNode bronchitis = net.createNode("Bronchitis");
bronchitis.addOutcomes("yes", "no");
bronchitis.setParents(Arrays.asList(raucher));
bronchitis.setProbabilities(//
0.6, 0.4, // raucher = yes
0.3, 0.7 // raucher = no
);
BayesNode tuberkuloseOderLungenkrebs = net.createNode("TuberkuloseOderLungenkrebs");
tuberkuloseOderLungenkrebs.addOutcomes("true", "false");
tuberkuloseOderLungenkrebs.setParents(Arrays.asList(tuberkulose, lungenkrebs));
tuberkuloseOderLungenkrebs.setProbabilities(//
// tuberkulose = yes
1.0, 0.0, // lungenkrebs = yes
1.0, 0.0, // lungenkrebs = no
// tuberkulose = no
1.0, 0.0, // lungenkrebs = yes
0.0, 1.0 // lungenkrebs = no
);
BayesNode roentgenbefund = net.createNode("Roentgenbefund");
roentgenbefund.addOutcomes("abnormal", "normal");
roentgenbefund.setParents(Arrays.asList(tuberkuloseOderLungenkrebs));
roentgenbefund.setProbabilities(//
0.98, 0.02, // tuberkuloseOderLungenkrebs = yes
0.05, 0.95 // tuberkuloseOderLungenkrebs = no
);
BayesNode dyspnoe = net.createNode("Dyspnoe");
tuberkuloseOderLungenkrebs.addOutcomes("yes", "no");
tuberkuloseOderLungenkrebs.setParents(Arrays.asList(tuberkuloseOderLungenkrebs, bronchitis));
tuberkuloseOderLungenkrebs.setProbabilities(//
// tuberkuloseOderLungenkrebs = yes
0.9, 0.1, // bronchitis = yes
0.7, 0.3, // bronchitis = no
// tuberkuloseOderLungenkrebs = no
0.8, 0.2, // bronchitis = yes
0.1, 0.9 // bronchitis = no
);
IBayesInferer inferer = new JunctionTreeAlgorithm();
inferer.setNetwork(net);
double[] belief = inferer.getBeliefs(dyspnoe);
System.out.println(belief[0] + " " + belief[1]);
}
}
kind Regards
Robert Füß