【发布时间】:2012-07-14 00:17:05
【问题描述】:
我想在 clojure 中构建一个贝叶斯网络,因为我还没有找到任何类似的项目。
我研究了很多 BN 的理论,但我仍然看不到如何实现网络(我不是人们所谓的“大师”,尤其是函数式编程)。
我知道 BN 只不过是一个 DAG 和很多概率表(每个节点一个),但现在我不知道如何实现 DAG。
我的第一个想法是一个巨大的集合(DAG)和一些小地图(DAG 的节点),每个地图都应该有一个名称(可能是一个:key)一个概率表(另一个地图?)一个父母的向量最后是非-后代的向量。
现在我不知道如何实现父母和非后代的引用(我应该在两个向量中放入什么)。 我想指针应该是完美的,但 clojure 缺少它;我可以在向量中放入:另一个节点的名称,但它会很慢,不是吗?
我在想,我可以使用更多集合而不是向量,这样可以更快地找到节点的后代。
概率表的类似问题,我仍然需要在其他节点上进行一些参考。
最后我还想学习 BN(从数据开始构建网络),这意味着我将大量更改概率表、边和节点。
我应该使用可变类型还是只会增加复杂性?
【问题讨论】:
-
这个[SO question][1]可以帮助你。 [1]:stackoverflow.com/questions/3127890/…
-
Chas Emerick 有一个talk on Bayesian networks,他给了一个 ClojureConj。里面有一些有用的信息可以回答你的一些问题。
-
你见过 loom lib 吗? github.com/aysylu/loom
-
可能不完全相关,但你看过robots.ox.ac.uk/~fwood/anglican(Clojure 中的Church 派生词)也看过robots.ox.ac.uk/~fwood/anglican/examples/index.html?
标签: algorithm clojure functional-programming directed-acyclic-graphs