我有一个由两个先验分布(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 的概率。
您需要使用概率密度函数 (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)
,您可以计算任何您喜欢的统计信息。