Clojure DAG (Байесовская сеть)

Я хотел бы построить байесовскую сеть в clojure, так как я не нашел подобного проекта.

Я много изучал теорию BN, но до сих пор не понимаю, как реализовать сеть (. Я не являюсь тем, кого люди называют "гуру" в чем бы то ни было, но особенно в функциональном программировании ).

Я знаю, что BN — это не что иное, как DAG и множество таблиц вероятностей (по одной для каждого узла ), но теперь я не знаю, как реализовать DAG.

Моей первой идеей был огромный набор (DAG )с небольшими картами (узел DAG ), каждая карта должна иметь имя (возможно :ключ )a таблица вероятностей (другую карту? )Вектор родителей и, наконец, вектор не-потомок.

Теперь я не знаю, как реализовать ссылку на родителей и не -потомков (, что я должен поместить в два вектора ). Я предполагаю, что указатель должен быть идеальным, но его нет в clojure; Я мог бы поместить в вектор имя :другого узла, но это будет медленно, не так ли?

Я думал, что вместо вектора я мог бы использовать больше набора,таким образом будет быстрее найти потомков узла.

Аналогичная проблема для таблицы вероятностей, где мне все еще нужна ссылка на другие узлы.

Наконец, я также хотел бы узнать, как BN (строит сеть, начиная с данных ), это означает, что я изменю много как таблиц вероятностей, ребер, так и узлов.

Должен ли я использовать изменяемые типы, или они только увеличат сложность?

14
задан Kevin Guan 22 March 2016 в 00:25
поделиться