Python中的贝叶斯网络:构建和采样

时间:2019-11-29 15:15:17

标签: python sampling bayesian-networks pomegranate

对于一个项目,我需要创建包含属性之间特定依赖关系的综合分类数据。这可以通过从预定义的贝叶斯网络采样来完成。在互联网上进行了一些探索之后,我发现Pomegranate是贝叶斯网络的一个很好的软件包,但是-就我而言-从这样的预定义贝叶斯网络中采样似乎是不可能的。例如,model.sample()引发NotImplementedError(尽管this解决方案如此)。

有人知道是否存在一个库,该库为贝叶斯网络的构建和抽样提供了良好的接口?

5 个答案:

答案 0 :(得分:4)

另一个选择是pgmpy,它是一个Python库,用于在贝叶斯网络中学习(结构和参数)和推理(统计和因果关系)。

您可以将前向采样和拒绝采样生成为Pandas数据框或numpy recarray。

以下代码从贝叶斯网络“ diff->等级<-intel”中生成20个正向样本作为Recarray。

from pgmpy.models.BayesianModel import BayesianModel
from pgmpy.factors.discrete import TabularCPD
from pgmpy.sampling import BayesianModelSampling

student = BayesianModel([('diff', 'grade'), ('intel', 'grade')])

cpd_d = TabularCPD('diff', 2, [[0.6], [0.4]])
cpd_i = TabularCPD('intel', 2, [[0.7], [0.3]])
cpd_g = TabularCPD('grade', 3, [[0.3, 0.05, 0.9, 0.5], [0.4, 0.25, 0.08, 0.3], [0.3, 0.7, 0.02, 0.2]], ['intel', 'diff'], [2, 2])

student.add_cpds(cpd_d, cpd_i, cpd_g)
inference = BayesianModelSampling(student)
df_samples = inference.forward_sample(size=20, return_type='recarray')

print(df_samples)

答案 1 :(得分:1)

我发现PyAgrum(https://agrum.gitlab.io/pages/pyagrum.html)可以胜任。它既可以用于通过BayesNet()类创建贝叶斯网络,也可以通过使用.drawSamples() class中的BNDatabaseGenerator()方法从该网络中进行采样。

答案 2 :(得分:1)

另一个选项是Bayespy(https://www.bayespy.org/index.html)。 您使用节点构建网络。 在每个节点上,您都可以调用random(),它实际上是从其分布中进行采样的:https://www.bayespy.org/dev_api/generated/generated/bayespy.inference.vmp.nodes.stochastic.Stochastic.random.html#bayespy.inference.vmp.nodes.stochastic.Stochastic.random

答案 3 :(得分:1)

使用pyAgrum,您只需:

#import pyAgrum
import pyAgrum as gum

# create a BN
bn=gum.fastBN("A->B[3]<-C{yes|No}->D")
# specify some CPTs (randomly filled by fastBN)
bn.cpt("A").fillWith([0.3,0.7])

# and then generate a database
gum.generateCSV(bn,"sample.csv",1000,with_labels=True,random_order=False) 
# which returns the LL(database)

the code in a notebook

有关使用pyAgrum的更多笔记本,请参见http://webia.lip6.fr/~phw/aGrUM/docs/last/notebooks/

免责声明:我是pyAgrum的作者之一:-)

答案 4 :(得分:0)

我也在搜索python中的库以与贝叶斯网络一起学习,采样,推理,我发现bnlearn。我尝试了几个例子,它奏效了。可以导入多个现有存储库或任何.bif类型。根据该库,

数据采样基于贝叶斯网络联合分布的正向采样。为此,需要将与CPD连接的DAG作为输入。也可以手动创建DAG(请参阅创建DAG部分)或加载现有的DAG。