贝叶斯网络中的推理

sup*_*g22 5 c++ inference probability bayesian

我需要在贝叶斯网络上进行一些推论,例如我在下面创建的示例. 贝叶斯网络

我正在寻找类似这样的东西来解决诸如P(F | A = True,B = True)之类的推论.我最初的做法是做类似的事情

For every possible output of F
  For every state of each observed variable (A,B)
     For every unobserved variable (C, D, E, G)
        // Calculate Probability
Run Code Online (Sandbox Code Playgroud)

但我认为这不会起作用,因为我们实际上需要同时检查多个变量,而不是一次一个.

我听说过Pearls算法用于消息传递,但我还没有找到一个不是非常密集的合理描述.对于附加信息,这些贝叶斯网络被约束为不超过15-20个节点,并且我们拥有所有条件概率表,代码实际上不必非常快速或高效.

基本上我正在寻找一种方法来做到这一点,不一定是最好的方法来做到这一点.

And*_*bis 0

您的贝叶斯网络(BN)似乎并不是特别复杂。我认为您应该轻松地使用精确推理方法,例如连接树算法。当然,您仍然可以进行强力枚举,但这会浪费 CPU 资源,因为有很多不错的库可以实现在图形模型中进行精确和近似推理的更智能方法。

由于您的标签提到了 C++,我的建议是libDAI它是一个编写良好的库,可以在通用因子图上实现多个精确和近似推理。它没有任何奇怪的依赖关系,并且很容易集成到您的项目中。它特别适合离散情况,例如您的情况,您有概率表。

现在,您注意到我提到了因子图。如果您不熟悉这个概念,我将向您推荐有关因子图的维基百科文章以及什么是“因子图”以及它们有什么用?。原理很简单,你将你的 BN 表示为因子图,然后 libDAI 会为你进行推理。

编辑:

由于 CPU 资源对您来说似乎不是问题,并且简单性是关键,因此您始终可以使用强力枚举。这个想法很简单。

您的贝叶斯网络代表联合概率分布,您可以用方程写下它,例如

P(A,B,C) = P(A|B,C) * P(B|C) * P(C) 
Run Code Online (Sandbox Code Playgroud)

假设您有所有条件概率分布的表格,即,P(A|B, C) P(B|C)然后P(C)您可以简单地检查变量AB和的所有可能值C并计算输出。