Python 3.x 使用Python3.x创建贝叶斯网络并学习参数

Python 3.x 使用Python3.x创建贝叶斯网络并学习参数,python-3.x,machine-learning,scikit-learn,probability,bayesian-networks,Python 3.x,Machine Learning,Scikit Learn,Probability,Bayesian Networks,我正在Windows上搜索python3.x最合适的工具来创建贝叶斯网络,从数据中学习其参数并执行推断 pip install bnlearn 我想将自己的网络结构定义如下: 它是从纸上取下来的 除了“大小”和“graspose”之外,所有变量都是离散的(并且只能取两种可能的状态),这两种变量是连续的,应建模为高斯混合变量 作者使用期望最大化算法学习条件概率表的参数,使用连接树算法计算精确推理 pip install bnlearn 据我所知,所有这些都是通过Murphy的Bayes网络工

我正在Windows上搜索python3.x最合适的工具来创建贝叶斯网络,从数据中学习其参数并执行推断

pip install bnlearn
我想将自己的网络结构定义如下:

它是从纸上取下来的

除了“大小”和“graspose”之外,所有变量都是离散的(并且只能取两种可能的状态),这两种变量是连续的,应建模为高斯混合变量

作者使用期望最大化算法学习条件概率表的参数,使用连接树算法计算精确推理

pip install bnlearn
据我所知,所有这些都是通过Murphy的Bayes网络工具箱在MatLab中实现的

我尝试在python中搜索类似的内容,以下是我的结果:

  • Python贝叶斯网络工具箱()。网站不工作,项目似乎不受支持
  • 贝斯比 我认为这是我真正需要的,但我没有找到一些类似于我的案例的例子,来理解如何构建网络结构
  • PyMC似乎是一个功能强大的模块,但我在Windows64、Python3.3上导入它时遇到了问题。安装开发版本时出现错误

    警告(theano.configdefaults):未检测到g++!Theano将无法执行优化的C实现(对于CPU和GPU),并将默认为Python实现。性能将严重下降。要删除此警告,请将无标志cxx设置为空字符串

  • 更新:

  • libpgm()。这正是我需要的,不幸的是Python3.x不支持
  • 非常有趣的积极开发库:PGMPY。不幸的是,目前还不支持连续变量和从数据中学习
    我们将非常感谢您提供的任何建议和具体示例。

    它看起来是最近更新的,包含了贝叶斯网络。我自己还没有试过,但是界面看起来很好,而且很容易学习。

    对于pymc的g++问题,我强烈建议您完成g++安装,它将极大地提高采样过程,否则您将不得不接受此警告,并在2000采样过程中坐在那里1小时

    修复警告的方法是: 1.安装g++,下载cywing并安装g++,你可以用谷歌搜索。要检查这一点,只需转到“cmd”并键入“g++”,如果它说“需要输入文件”,很好,您已经安装了g++了。 2.安装python包:mingw,libpython 3.安装python包:theano

    这应该可以解决这个问题


    我目前正在处理与您相同的问题,祝您好运

    聚会迟到了,但我已经用JPype结束了BayeServer Java API;它可能没有您需要的所有功能,但您可以使用以下方式创建上述网络:

    from bayesianpy.network import Builder as builder
    import bayesianpy.network
    
    nt = bayesianpy.network.create_network()
    
    # where df is your dataframe
    task = builder.create_discrete_variable(nt, df, 'task')
    
    size = builder.create_continuous_variable(nt, 'size')
    grasp_pose = builder.create_continuous_variable(nt, 'GraspPose')
    
    builder.create_link(nt, size, grasp_pose)
    builder.create_link(nt, task, grasp_pose)
    
    for v in ['fill level', 'object shape', 'side graspable']:
        va = builder.create_discrete_variable(nt, df, v)
        builder.create_link(nt, va, grasp_pose)
        builder.create_link(nt, task, va)
    
    # write df to data store
    with bayesianpy.data.DataSet(df, bayesianpy.utils.get_path_to_parent_dir(__file__), logger) as dataset:
        model = bayesianpy.model.NetworkModel(nt, logger)
        model.train(dataset)
    
        # to query model multi-threaded
        results = model.batch_query(dataset, [bayesianpy.model.QueryModelStatistics()], append_to_df=False)
    

    我不属于Bayes服务器,Python包装器也不是“官方的”(您可以通过Python直接使用JavaAPI)。我的包装器对我不常使用的函数进行了一些假设和限制。报告在这里:

    我正在寻找一个类似的图书馆,我发现这是一个很好的图书馆。谢谢

    下面是一个如何使用它的示例

    from pomegranate import *
    import numpy as np
    
    mydb=np.array([[1,2,3],[1,2,4],[1,2,5],[1,2,6],[1,3,8],[2,3,8],[1,2,4]])
    
    bnet = BayesianNetwork.from_samples(mydb)
    
    print(bnet.node_count())
    
    print(bnet.probability([[1,2,3]]))
    print (bnet.probability([[1,2,8]]))
    

    试试bnlearn库,它包含许多从数据中学习参数和执行推断的函数

    pip install bnlearn
    
    您的用例如下所示:

    # Import the library
    import bnlearn
    
    # Define the network structure
    edges = [('task', 'size'),
             ('lat var', 'size'),
             ('task', 'fill level'),
             ('task', 'object shape'),
             ('task', 'side graspable'),
             ('size', 'GrasPose'),
             ('task', 'GrasPose'),
             ('fill level', 'GrasPose'),
             ('object shape', 'GrasPose'),
             ('side graspable', 'GrasPose'),
             ('GrasPose', 'latvar'),
    ]
    
    # Make the actual Bayesian DAG
    DAG = bnlearn.make_DAG(edges)
    
    # DAG is stored in adjacency matrix
    print(DAG['adjmat'])
    
    # target           task   size  lat var  ...  side graspable  GrasPose  latvar
    # source                                 ...                                  
    # task            False   True    False  ...            True      True   False
    # size            False  False    False  ...           False      True   False
    # lat var         False   True    False  ...           False     False   False
    # fill level      False  False    False  ...           False      True   False
    # object shape    False  False    False  ...           False      True   False
    # side graspable  False  False    False  ...           False      True   False
    # GrasPose        False  False    False  ...           False     False    True
    # latvar          False  False    False  ...           False     False   False
    # 
    # [8 rows x 8 columns]
    
    # No CPDs are in the DAG. Lets see what happens if we print it.
    bnlearn.print_CPD(DAG)
    # >[BNLEARN.print_CPD] No CPDs to print. Use bnlearn.plot(DAG) to make a plot.
    
    # Plot DAG. Note that it can be differently orientated if you re-make the plot.
    bnlearn.plot(DAG)
    

    现在我们需要数据来学习它的参数。假设这些存储在df中。数据文件中的变量名必须存在于DAG中

    # Read data
    df = pd.read_csv('path_to_your_data.csv')
    
    # Learn the parameters and store CPDs in the DAG. Use the methodtype your desire. Options are maximumlikelihood or bayes.
    DAG = bnlearn.parameter_learning.fit(DAG, df, methodtype='maximumlikelihood')
    # CPDs are present in the DAG at this point.
    bnlearn.print_CPD(DAG)
    
    # Start making inferences now. As an example:
    q1 = bnlearn.inference.fit(DAG, variables=['lat var'], evidence={'fill level':1, 'size':0, 'task':1})
    
    下面是一个演示数据集(Spreader)的工作示例。你可以玩这个

    # Import example dataset
    df = bnlearn.import_example('sprinkler')
    print(df)
    #      Cloudy  Sprinkler  Rain  Wet_Grass
    # 0         0          0     0          0
    # 1         1          0     1          1
    # 2         0          1     0          1
    # 3         1          1     1          1
    # 4         1          1     1          1
    # ..      ...        ...   ...        ...
    # 995       1          0     1          1
    # 996       1          0     1          1
    # 997       1          0     1          1
    # 998       0          0     0          0
    # 999       0          1     1          1
    
    # [1000 rows x 4 columns]
    
    
    # Define the network structure
    edges = [('Cloudy', 'Sprinkler'),
             ('Cloudy', 'Rain'),
             ('Sprinkler', 'Wet_Grass'),
             ('Rain', 'Wet_Grass')]
    
    # Make the actual Bayesian DAG
    DAG = bnlearn.make_DAG(edges)
    # Print the CPDs
    bnlearn.print_CPD(DAG)
    # [BNLEARN.print_CPD] No CPDs to print. Use bnlearn.plot(DAG) to make a plot.
    # Plot the DAG
    bnlearn.plot(DAG)
    

    更多示例可在bnlearn的页面上找到:

    我从未尝试过,但您可以查看@runDOSrun谢谢。不幸的是,似乎没有移植到python 3.x。您尝试过scikit学习吗?似乎有你想要的,还有许多其他在Python3.x中工作的ML算法。我不认为scikit learn的naive Bayes会像提问者希望的那样进行推理?不过,libpgm现在似乎支持python3:是的,看起来很有希望,谢谢。我要试一试。展望连续变量何时也将被支持。@Spu您尝试过吗?你的经历是什么?