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

Bayesian network in Python: both construction and sampling

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

有谁知道是否存在一个库可以为构建和采样 of/from 贝叶斯网络提供良好的接口?

我发现 PyAgrum (https://agrum.gitlab.io/pages/pyagrum.html) does the job. It can both be used to create a Bayesian Network via the BayesNet() class and to sample from such a network by using the .drawSamples() method from the a BNDatabaseGenerator() class

另一个选项是 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

使用 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 的作者之一:-)

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

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

以下代码从贝叶斯网络“diff -> grade <- 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)

我还在 python 中搜索用于贝叶斯网络学习、采样和推理的库,我找到了 bnlearn。我尝试了几个例子并且它起作用了。可以导入多个现有存储库或任何 .bif 类型。根据这个图书馆,

Sampling of data is based on forward sampling from joint distribution of the Bayesian network. In order to do that, it requires as input a DAG connected with CPDs. It is also possible to create a DAG manually (see create DAG section) or load an existing one