Я работаю над заданием по вероятностному рассуждению для вступительного курса ИИ.У меня возникла небольшая (программируемая) проблема с построением таблиц условной вероятности (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
просто переполняет кучу без необходимости.
Заранее спасибо!