对于一个项目,我需要创建包含属性之间特定依赖关系的综合分类数据。这可以通过从预定义的贝叶斯网络中采样来完成。在互联网上进行了一些探索后,我发现这Pomegranate
是贝叶斯网络的一个很好的包,但是 - 就我而言 - 从这样一个预定义的贝叶斯网络中采样似乎是不可能的。作为一个例子,model.sample()
提出了一个NotImplementedError
(尽管这个解决方案是这样说的)。
有谁知道是否存在为贝叶斯网络的构建和采样提供良好接口的库?
对于一个项目,我需要创建包含属性之间特定依赖关系的综合分类数据。这可以通过从预定义的贝叶斯网络中采样来完成。在互联网上进行了一些探索后,我发现这Pomegranate
是贝叶斯网络的一个很好的包,但是 - 就我而言 - 从这样一个预定义的贝叶斯网络中采样似乎是不可能的。作为一个例子,model.sample()
提出了一个NotImplementedError
(尽管这个解决方案是这样说的)。
有谁知道是否存在为贝叶斯网络的构建和采样提供良好接口的库?
使用 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 的作者之一 :-)
另一个选择是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)
另一种选择是 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
我还在用 python 寻找一个库来处理贝叶斯网络学习、采样、推理,然后我找到了 bnlearn。我尝试了几个例子,它奏效了。可以导入多个现有存储库或任何 .bif 类型。根据这个图书馆,
数据采样基于贝叶斯网络联合分布的前向采样。为此,它需要一个与 CPD 连接的 DAG 作为输入。也可以手动创建 DAG(请参阅创建 DAG 部分)或加载现有 DAG
我发现 PyAgrum ( https://agrum.gitlab.io/pages/pyagrum.html ) 可以完成这项工作。它既可以用于通过类创建贝叶斯网络,也可以通过使用类中的方法BayesNet()
从这样的网络中采样。 .drawSamples()
BNDatabaseGenerator()