Numpy scipy:评估贝叶斯网络的最可能值和置信度

Numpy scipy:评估贝叶斯网络的最可能值和置信度,numpy,scipy,Numpy,Scipy,我有一个由两个先验分布(a和B)和一个后验分布(C | a,B)组成的贝叶斯网络。在scipy中,我如何找到C的最可能值 其次,我如何计算该值的置信水平?我将置信水平定义为等于C的实际值等于或大于给定值的概率 更具体地说,A和B是x的累积概率函数(cdf)。给定一个特定的a,a(a),给出a的实际值小于a的概率 类似地,C是a、b、C的函数,并返回C的实际值小于C的概率,给定a和b的特定值。您需要使用概率密度函数(PDF),而不是CDF。您只需对CDF进行微分即可从CDF中获取PDF(如果函数是

我有一个由两个先验分布(a和B)和一个后验分布(C | a,B)组成的贝叶斯网络。在scipy中,我如何找到C的最可能值

其次,我如何计算该值的置信水平?我将置信水平定义为等于C的实际值等于或大于给定值的概率

更具体地说,A和B是x的累积概率函数(cdf)。给定一个特定的a,a(a),给出a的实际值小于a的概率


类似地,C是a、b、C的函数,并返回C的实际值小于C的概率,给定a和b的特定值。

您需要使用概率密度函数(PDF),而不是CDF。您只需对CDF进行微分即可从CDF中获取PDF(如果函数是列表形式的,则以数字方式进行)。请注意,您指定它的方式是,取
CDF(c | a,b)
关于
c
给出了条件概率密度
p(c | a,b)

要获得
c
的边际分布,您需要将
a、b
积分出来:

[b_min, b_max]=[-10.0, 10.0] # whatever the reasonable bound in b are
[a_min, a_max]=[-10.0,10.0] # whatever the reasonable bounds in a are

def pc_conditional( c, a,b ):
    ''' conditional probability density p(c|a,b)'''
    ...
def pa(a):
     ''' probability density p(a)'''
     ....
def pb(b):
    ''' probability density p(b)'''
   ...

def joint_distribution( c, a,b ):
    ''' joint distribution over all variables; p(c,a,b)=p(c|a,b)p(a)p(b) '''
    return pc_conditional(c,a,b)*pa(a)*pb(b)

def pca_marginal( c, a ):
     ''' distribution over c,a after integrating out b; p(c,a)=integrate[ p(c,a,b)db] '''
    def integrand( b ):
        return joint_distribution( c,a ,b)
    return scipy.integrate.quad( integrand, b_min, b_max)

def pc_marginal(c):
    def integrand(a):
         return pca_marginal( c, a )
    return scipy.integrate.quad( integrand, a_min, a_max )

# You can all pc_marginal(c) to obtain the (marginal) probability
# density value for the selected value of c.  You could use vectorize
# to allow for calling it with an array of values.

现在你可以计算分布
p(c)
,你可以计算任何你喜欢的统计信息。

这不是一个编程问题——我建议或数学论坛。虽然我的程序的主题是数学,但我仍然相信这是一个编程问题,因为我的主要问题是实现。如果我写一个关于汽车的程序有困难,我希望你不要把我送到cars.stackexchange.com我更喜欢考虑cdf,因为我可以表示离散函数的概率(用阶跃函数等),而相应的pdf上有脉冲,我发现很难表示或处理。要做你想做的事,也就是说,边缘化出
a,b
,您需要使用PDF。如果你的变量是离散的,这会让生活更简单,因为你只需要求和(我推断出连续变量,因为你使用CDF,它们通常只用于连续变量)。谢谢Dave。实际上,A是估计的平均值,B是估计的方差,C是正态分布,以方差和均值为条件。平均值的“合理界限”必须为[-inf,inf]。这种方法会继续有效吗?是的,假设你的均值/方差分布表现良好(以足够快的速度无穷远处归零)
scipy.quad
可以处理集成上的无限边界。