贝叶斯网络中的推理

时间:2015-05-26 02:11:42

标签: c++ probability bayesian inference

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

我正在做类似这样的事情来解决诸如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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

现在,你注意到我提到了因子图。如果你不熟悉这个概念,我会推荐你​​Wikipedia,但原理很简单。您应该将您的BN表示为因子图,然后libDAI将为您进行推理。

修改

由于CPU资源对您来说似乎不是问题,而简单性是关键,相反,您可以始终使用强力枚举。这个想法很简单。您的贝叶斯网络代表一个联合概率分布,您可以根据等式来记录,例如

P(A,B,C) = P(A|B,C) * P(B|C) * P(C) 

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