我正在尝试创建自己的贝叶斯网络程序,以使用石榴对非常简单的法院裁决场景进行建模,这与 monty hall 问题非常相似,该问题已被充分记录为石榴贝叶斯网络的示例。我已经使节点作证(证人是否证明被告有罪)取决于节点是否可靠(证人是否可靠)和有罪(被告是否犯罪)。但是,当我尝试为节点分配某个值或信念时,为了查看其他节点的条件概率如何变化,使用信念 = predict_proba() 似乎没有将值分配给这些节点作为数组信念简单地返回每个变量的完整概率分布,就好像系统中的每个变量仍然未知一样。
from pomegranate import *
import math
import pomegranate as pg
reliable = DiscreteDistribution({'T':3.0/4.0, 'F':1.0/4.0})
guilty = DiscreteDistribution({'T':1.0/2.0, 'F':1.0/2.0})
testifies = ConditionalProbabilityTable([['T','T','T',1.0],
['T','T','F',0.0],
['T','F','T',0.0],
['T','F','F',1.0],
['F','T','T',0.5],
['F','T','F',0.5],
['F','F','T',0.5],
['F','F','F',0.5]],[reliable,guilty])
s1 = State(reliable,name="Reliable")
s2 = State(guilty,name="Guilty")
s3 = State(testifies,name="Testifies")
network = BayesianNetwork("Court Ruling")
network.add_states(s1,s2,s3)
network.add_edge(s1,s3)
network.add_edge(s2,s3)
network.bake()
beliefs = network.predict_proba({'reliable':'T','guilty':'F'})
beliefs
这返回
array([ {
"class" : "Distribution",
"dtype" : "str",
"name" : "DiscreteDistribution",
"parameters" : [
{
"T" : 0.7499999999999998,
"F" : 0.2500000000000002
}
],
"frozen" : false
},
{
"class" : "Distribution",
"dtype" : "str",
"name" : "DiscreteDistribution",
"parameters" : [
{
"T" : 0.5,
"F" : 0.5
}
],
"frozen" : false
},
{
"class" : "Distribution",
"dtype" : "str",
"name" : "DiscreteDistribution",
"parameters" : [
{
"T" : 0.5,
"F" : 0.5
}
],
"frozen" : false
}], dtype=object)
什么时候应该返回
array(['T','F',
{
"class" : "Distribution",
"dtype" : "str",
"name" : "DiscreteDistribution",
"parameters" : [
{
"T" : 0.5,
"F" : 0.5
}
],
"frozen" : false
}], dtype=object)