有效地构建真值表(CPT)

时间:2018-12-27 21:53:10

标签: java artificial-intelligence bayesian-networks

我正在为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只会不必要地使堆溢出。

谢谢!

0 个答案:

没有答案