python - 来自石榴贝叶斯网络的样本

标签 python machine-learning python-3.5 bayesian-networks pomegranate

我使用 from_samples() 构建了一个贝叶斯网络在石榴中。我能够使用 model.predict() 从模型中获得最大可能的预测.我想知道是否有办法有条件地(或无条件地)从这个贝叶斯网络中采样?即是否有从网络中获取随机样本而不是最大可能的预测?

我看了model.sample() ,但它正在提高NotImplementedError .

此外,如果这不可能使用 pomegranate ,还有哪些其他库非常适合 Python 中的贝叶斯网络?

最佳答案

只是为了用一个具体的例子来阐明上述答案,以便对某人有所帮助,让我们从以下简单的数据集(有 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 
现在让我们使用 'exact' 从上述数据中学习贝叶斯网络结构。算法与 pomegranate (使用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 结构以及相应的 CPT 如下图所示
enter image description here
从上图可以看出,它准确地解释了数据。我们可以使用模型计算数据的对数似然,如下所示:
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:
enter image description here
这次数据的对数似然为
np.sum(model.log_probability(df.to_numpy()))
# -8.386987635761297
表示算法 exact找到更好的估计。

关于python - 来自石榴贝叶斯网络的样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51035303/

相关文章:

tkinter - 如何找出小部件的顶级容器?

python - Tensorflow 向量的形状为 (col,)

Python Matplotlib slider 小部件未更新

r - 如何在数据框中查找与给定向量最相似的行

python - 迭代替换 json 文件中的值

machine-learning - 设计天气数据的分类问题

python-3.x - 使用 pip 在 Windows 10 中安装 spaCy 时出现问题

windows - 如何使用 bash 命令在 Windows 10 中创建和激活虚拟环境

python - 如何在 Google Colab 中运行 FastAPI/Uvicorn?

python - 创建一个函数,该函数接受以字符串形式给出的方程并计算它