首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中的贝叶斯网络:构造和抽样

Python中的贝叶斯网络:构造和抽样
EN

Data Science用户
提问于 2019-11-30 10:14:36
回答 3查看 650关注 0票数 3

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

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

EN

回答 3

Data Science用户

发布于 2021-01-29 21:17:07

为了用一个具体的例子来解释上面的答案,为了对某人有帮助,让我们从下面的简单数据集开始(有4个变量和5个数据点):

代码语言:javascript
运行
复制
import pandas as pd
df = pd.DataFrame({'A':[0,0,0,1,0], 'B':[0,0,1,0,0], 'C':[1,1,0,0,1], 'D':[0,1,0,1,1]})
df.head()

#   A   B   C   D
#0  0   0   1   0
#1  0   0   1   1
#2  0   1   0   0
#3  1   0   0   1
#4  0   0   1   1 

现在,让我们使用石榴的“精确”算法(使用DP/A*学习最佳BN结构)从上述数据中学习贝叶斯网络结构,使用以下代码片段:

代码语言:javascript
运行
复制
import numpy as np
from pomegranate import *
model = BayesianNetwork.from_samples(df.to_numpy(), state_names=df.columns.values, algorithm='exact')
# model.plot()

学习的BN结构与相应的CPTs一起显示在下一个图中:

从上面的数字可以看出,它准确地解释了数据。我们可以用模型计算数据的对数可能性,如下所示:

代码语言:javascript
运行
复制
np.sum(model.log_probability(df.to_numpy()))
# -7.253364813857112

一旦了解了BN的结构,我们可以从BN中抽样调查如下:

代码语言:javascript
运行
复制
model.sample()  
# array([[0, 1, 0, 0]], dtype=int64)

另外,如果我们使用algorithm='chow-liu' (它找到一个具有快速近似的树状结构),我们将得到以下BN:

这一次数据的日志可能性是

代码语言:javascript
运行
复制
np.sum(model.log_probability(df.to_numpy()))
# -8.386987635761297

这表明exact算法找到了较好的估计值。

票数 1
EN

Data Science用户

发布于 2020-05-24 15:27:51

请使用函数from_samples()从数据构建贝叶斯n/w。

票数 0
EN

Data Science用户

发布于 2020-05-24 16:25:50

pomegranate中有一个关于这个在github的未决问题。在这个问题上,他们提到了一个实现拒绝抽样和吉布斯抽样的正在进行的拉出请求;公关讨论中的最后一个评论是7天前(2020年,5月17日),所以它没有被放弃,而是积极开发。您可以使用来自该PR的pomegranate版本从您的贝叶斯网络中进行示例。

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/64019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档