Я хотел бы построить байесовскую сеть в clojure, так как я не нашел подобного проекта.
Я изучил много теории BN, но до сих пор не понимаю, как реализовать сеть (я не тот, кого люди называют «гуру» в чем-либо, но особенно в функциональном программировании).
Я знаю, что BN — это не что иное, как DAG и множество таблиц вероятностей (по одной для каждого узла), но теперь я не знаю, как реализовать DAG.
Моей первой идеей был огромный набор (DAG) с несколькими маленькими картами (узел DAG), каждая карта должна иметь имя (вероятно, ключ), таблицу вероятностей (еще одну карту?), вектор родителей и, наконец, вектор не-потомка.
Теперь я не знаю, как реализовать ссылку на родителей и не потомков (что я должен поместить в два вектора). Я предполагаю, что указатель должен быть идеальным, но его нет в clojure; Я мог бы поместить в вектор имя другого узла, но это будет медленно, не так ли?
Я думал, что вместо вектора я мог бы использовать больше набора, таким образом было бы быстрее найти потомков узла.
Аналогичная проблема для таблицы вероятностей, где мне все еще нужна ссылка на другие узлы.
Наконец, я также хотел бы изучить BN (построить сеть, начиная с данных), это означает, что я буду много изменять как таблицы вероятностей, ребро, так и узлы.
Должен ли я использовать изменяемые типы, или они только увеличат сложность?