5

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

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

4

5 回答 5

4

使用 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)

笔记本中的代码

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

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

于 2020-01-03T16:07:08.827 回答
4

另一个选择是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)
于 2020-07-20T11:50:02.923 回答
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

于 2019-12-02T14:55:29.323 回答
1

我还在用 python 寻找一个库来处理贝叶斯网络学习、采样、推理,然后我找到了 bnlearn。我尝试了几个例子,它奏效了。可以导入多个现有存储库或任何 .bif 类型。根据这个图书馆,

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

于 2020-11-03T21:13:37.027 回答
1

我发现 PyAgrum ( https://agrum.gitlab.io/pages/pyagrum.html ) 可以完成这项工作。它既可以用于通过类创建贝叶斯网络,也可以通过使用中的方法BayesNet()从这样的网络中采样。 .drawSamples()BNDatabaseGenerator()

于 2019-12-02T14:47:49.533 回答