Loopy 信念传播代码示例

Posted

技术标签:

【中文标题】Loopy 信念传播代码示例【英文标题】:Loopy Belief Propagation code example 【发布时间】:2011-01-22 22:29:59 【问题描述】:

有人知道贝叶斯网络(循环)信念的和积算法的工作代码示例吗?我已经在地球上搜寻了几天,但运气不佳。我对它是哪种语言无所谓。

我找到的有关该主题的所有文档都充满了晦涩难懂且模棱两可的数学语言。这似乎不是一个困难的算法,但我不能确定,因为一些棘手的部分被掩盖了太多。

另外,使用实数(而不是变量名)的示例也可能会起到作用。

【问题讨论】:

【参考方案1】:

我也有类似的情况。我正在使用 Christopher M. Bishop 的“模式识别和机器学习”一书进行理论介绍,尽管我确实想在其他环境中使用该算法。 “max-product”和“sum-product”一章描述了信念传播,尽管它是非常数学的。

我仍在寻找一个小的数字示例,所以如果你找到一个我会非常感兴趣的。

同时你可以看看libDAI,一个实现BP的开源库。

【讨论】:

那不勒斯的《学习贝叶斯网络》一书提供了该算法的两个版本。没有遗漏任何细节,尽管它有一些粗鲁的数学语法。他还提供了 大量 数值示例来说明算法运行时会发生什么。如果您愿意,我可以将 PDF 发送给您(超过 700 页,bleh)。它没有明确解决循环传播问题,但我可能会弄清楚这一点。这里有很好的资源:@​​987654322@我自己(用 Java)实现它,所以我会在它工作并调试时发布一些东西。 另外,请参阅mcs.vuw.ac.nz/courses/COMP421/2008T1/code/GM/markov.py 了解 Python 实现。虽然我确信它是错误的,但我不明白。 从图书馆拿到那不勒斯的书。真的很高兴有一些很好的例子!谢谢你的提示。不幸的是,它没有解释贝叶斯网络、马尔可夫网络和因子图的关系,这似乎是我目前缺少的链接,无法完全理解循环 BP。我觉得其他一些有用的资源:@​​987654324@kyb.tuebingen.mpg.de/bs/people/jorism/articles/… 这些 cmets 的所有链接都无法访问。【参考方案2】:

我已经为贝叶斯网络实现了 Pearl 的信念传播算法。它也支持循环传播,因为它会在知情信念值收敛到 0.001 以内时终止。

所有代码都是Java,可以在我的Google code pen-ui svn repo.找到

这并没有明确地制作因子图。

“支持”类有一个主函数和几个静态方法,可以创建您可以使用的小型网络。特别是我实现了在那不勒斯的书中找到的三节点 Burlar-FreightTruck-Alarm 网络,并且我的数字检查出来了。 (除此之外没有任何承诺!)

【讨论】:

【参考方案3】:

我正在 Clojure 中实现因子图/信念传播算法,但代码尚未准备好。 (我的代码还将贝叶斯网络从命题逻辑提升到一阶/高阶逻辑。)

无论如何,我想分享一些技巧:

    首先,请注意,尽管边缘化表示为求和,但其属性与求和不同。特别是,它与概率表的乘积(称为势)通勤。这就是为什么在数学推导中,和和乘积可以交换,而在普通算术中则不能。

    请注意,在 Pearl 的算法中,上行和下行的消息是不同的——可能性上行,概率下行。 (这就是贝叶斯规则在信念传播推导中起作用的原因)。

    在因子图算法中,消息是 CPT(条件概率表),例如 P(A|K)。 P(A|K) 和 P(K|A) 和 P(A,K) 的 CPT 包含基本相同的信息。在终端节点,我们必须边缘化以及在适当的变量上调节 CPT。这似乎在数学符号中被掩盖了。

【讨论】:

以上是关于Loopy 信念传播代码示例的主要内容,如果未能解决你的问题,请参考以下文章

用约束规划+概率图模型(信念传播)+神经网络端到端求解问题

18个示例详解 Spring 事务传播机制

线程(任务)中的异常不会像示例所暗示的那样传播

众包中使用变分推断和信念传播的几篇文章

外行术语中的 Spring 传播示例

Win32 消息处理程序错误传播