对于一个项目,我需要创建包含属性之间特定依赖关系的合成分类数据。这可以通过预先定义的贝叶斯网络的抽样来实现。在互联网上进行了一些探索之后,我发现Pomegranate是贝叶斯网络的一个很好的包--就我而言--从这样一个预先定义的贝叶斯网络中取样似乎是不可能的。例如,model.sample()引发了一个NotImplementedError (尽管这解决方案这么说)。
有没有人知道是否存在一个库,它为贝叶斯网络的构建和抽样提供了一个良好的接口?
发布于 2021-01-29 21:17:07
为了用一个具体的例子来解释上面的答案,为了对某人有帮助,让我们从下面的简单数据集开始(有4个变量和5个数据点):
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结构)从上述数据中学习贝叶斯网络结构,使用以下代码片段:
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一起显示在下一个图中:

从上面的数字可以看出,它准确地解释了数据。我们可以用模型计算数据的对数可能性,如下所示:
np.sum(model.log_probability(df.to_numpy()))
# -7.253364813857112一旦了解了BN的结构,我们可以从BN中抽样调查如下:
model.sample()
# array([[0, 1, 0, 0]], dtype=int64)另外,如果我们使用algorithm='chow-liu' (它找到一个具有快速近似的树状结构),我们将得到以下BN:

这一次数据的日志可能性是
np.sum(model.log_probability(df.to_numpy()))
# -8.386987635761297这表明exact算法找到了较好的估计值。
发布于 2020-05-24 15:27:51
请使用函数from_samples()从数据构建贝叶斯n/w。
https://datascience.stackexchange.com/questions/64019
复制相似问题