我正在为AI入门课程进行概率推理作业。我在贝叶斯网络中构造条件概率表(cpt)时遇到了(编程)麻烦。
我想为一个BayesNode
对象(其集合为parents
)构造cpt。 cpt实际上是一个真值表,为每个父项分配真/假值,并为该表中的每个条目计算概率。
这是我到目前为止所拥有的:
abstract class BayesNode<T> {
ArrayList<BayesNode> parents;
Map<Map<BayesNode,Boolean>, Probability> cpt = new HashMap<>();
}
void constructCpt() {
constructEntries(new HashMap<>(), new LinkedList<>(this.parents));
}
private void constructEntries
(Map<BayesNode, Boolean> tableEntry, Queue<BayesNode> left){
if (left.size() == 0){
cpt.put(new HashMap<>(tableEntry), computeConditionalProbability(tableEntry));
}
else{
BayesNode nextParent = left.poll();
tableEntry.put(nextParent,true);
constructEntries(tableEntry, new LinkedList<>(left));
tableEntry.put(nextParent, false);
constructEntries(tableEntry, new LinkedList<>(left));
}
}
cpt
是表本身,其键是另一个HashMap
,代表表中的条目,其值是该条目的概率。
内部映射将BayesNode
作为键,并将布尔值作为值。
虽然到目前为止似乎还可以,但是我有种以某种方式错了的感觉,也许还有一种更优雅的方法可以迭代节点的父节点以构造表。特别是,我担心重复创建LinkedList
只会不必要地使堆溢出。
谢谢!