1

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

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

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

类似地,C 是 a,b,c 的函数,在给定 A 和 B 的特定值的情况下,返回 C 的实际值小于 c 的概率。

4

1 回答 1

2

您需要使用概率密度函数 (PDF) 而不是 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),您可以计算任何您喜欢的统计信息。

于 2013-06-03T19:24:27.203 回答