【问题标题】:Bayesian network in Python: both construction and samplingPython 中的贝叶斯网络:构建和采样
【发布时间】:2020-03-25 04:48:55
【问题描述】:

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

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

【问题讨论】:

  • 您愿意:1) 切换语言还是 2) 自己实施采样?
  • 请注意,寻求建议的问题通常不在此处讨论(请参阅help center)。第一部分还可以。不知道答案,可能Pomegranate包目前还没有那么成熟。
  • @kutschkem 我正在寻找一个库,它为定义贝叶斯网络提供了良好的接口,然后我可以从中采样以获得合成数据集。

标签: python sampling bayesian-networks pomegranate


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

      查看http://webia.lip6.fr/~phw/aGrUM/docs/last/notebooks/ 了解更多使用 pyAgrum 的笔记本

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

      【讨论】:

      • 是的,我发现了这一点。你的回复很酷,因为我昨天在我的论文中提到了 pyAgrum(包含你的名字),因为我在很多事情上都使用 PyAgrum,但主要是用软证据推断 BN!
      【解决方案4】:

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

      您可以将转发和拒绝样本生成为 Pandas 数据框或 numpy recarray。

      以下代码从贝叶斯网络“diff -> grade

      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)
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2018-11-07
          • 2013-04-08
          • 1970-01-01
          • 2011-01-09
          • 2012-07-14
          • 2013-05-11
          • 2013-07-19
          • 2019-11-05
          相关资源
          最近更新 更多