我有两个先验分布(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的概率。
答案 0 :(得分:2)
您需要使用概率密度函数(PDF)而不是CDF。您只需通过区分它就可以从CDF获取PDF(如果函数列表,则以数字方式执行)。请注意你指定它的方式,取你的衍生物
关于CDF(c | a, b)
的{{1}}为您提供了条件概率密度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.
,您可以计算您喜欢的任何统计信息。