Эффективное построение таблицы истинности (CPT) - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю над заданием по вероятностному рассуждению для вступительного курса ИИ.У меня возникла небольшая (программируемая) проблема с построением таблиц условной вероятности (cpt) в байесовской сети.

Я хочу построить cpt для объекта BayesNode, у которого есть набор parents.На самом деле cpt - это таблица истинности, присваивающая значения true / false каждому из родителей, и для каждой записи в этой таблице должна быть вычислена вероятность.

Это то, что я имею до сих пор:

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 просто переполняет кучу без необходимости.

Заранее спасибо!

...