Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 石榴中的贝叶斯网络样本_Python_Machine Learning_Python 3.5_Bayesian Networks_Pomegranate - Fatal编程技术网

Python 石榴中的贝叶斯网络样本

Python 石榴中的贝叶斯网络样本,python,machine-learning,python-3.5,bayesian-networks,pomegranate,Python,Machine Learning,Python 3.5,Bayesian Networks,Pomegranate,我用石榴中的from_samples()构建了一个贝叶斯网络。我能够使用model.predict()从模型中获得最大可能的预测。我想知道是否有一种方法可以有条件地(或无条件地)从这个贝叶斯网络中取样?i、 e.是否存在从网络中获取随机样本而不是最大可能预测的方法 我查看了model.sample(),但它引发了NotImplementedError 另外,如果使用石榴无法做到这一点,那么在Python中,还有哪些库适合于贝叶斯网络呢?如果我正确查看提交历史,那么现在就检查model.sampl

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

我查看了
model.sample()
,但它引发了
NotImplementedError

另外,如果使用
石榴
无法做到这一点,那么在Python中,还有哪些库适合于贝叶斯网络呢?

如果我正确查看提交历史,那么现在就检查
model.sample()
d

您还可以查看哪些支持分布混合。
但是,我不知道还有其他工具箱有类似的工厂方法,比如pomogranate中的
from_samples()

从“烘焙”BayesianNetwork中取样的一种方法是使用predict_proba方法。predict_proba根据提供的信息返回与未提供信息的每个节点对应的分布列表

e、 g:

bn = BayesianNetwork.from_samples(X)
proba = bn.predict_proba({"1":1,"2":0}) # proba will be an array of dists
samples = np.empty_like(proba)
for i in np.arange(proba.shape[0]):
    for j in np.arange(proba.shape[1]):
        if hasattr(proba[i][j],'sample'):
            samples[i,j] = proba[i][j].sample(10000).mean() #sample and aggregate however you want
        else:
            samples[i,j] = proba[i][j]
pd.Series(samples,index=X.columns) #convert samples to a pandas.Series with column labels as index

为了用一个具体的例子来阐明上述答案,以便对某人有所帮助,让我们从以下简单的数据集(包含4个变量和5个数据点)开始:

现在,让我们使用
石榴
(使用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

从上图可以看出,它准确地解释了数据。我们可以使用以下模型计算数据的对数似然:

np.sum(model.log_probability(df.to_numpy()))
# -7.253364813857112
model.sample()  
# array([[0, 1, 0, 0]], dtype=int64)
一旦学习了BN结构,我们可以从BN中取样如下:

np.sum(model.log_probability(df.to_numpy()))
# -7.253364813857112
model.sample()  
# array([[0, 1, 0, 0]], dtype=int64)
作为旁注,如果我们使用
算法class='chow-liu'
(它找到一个具有快速近似的树状结构),我们将获得以下BN:

这次数据的对数可能性为

np.sum(model.log_probability(df.to_numpy()))
# -8.386987635761297

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

链接提交是针对BayesModel类的,而不是OP正在查询的BayesianNetwork类。请看这里: