Python 概率密度函数乘积与Scipy的积分

Python 概率密度函数乘积与Scipy的积分,python,scipy,statistics,Python,Scipy,Statistics,给出: from scipy import stats import scipy.integrate as integrate y1 = 90; n1 = 100; y2 = 2; n2 = 2; result1 = integrate.dblquad(lambda theta1, theta2: (stats.beta.pdf(theta1, y1+1, n1-y1+1)*stats.beta.pdf(theta2,y2+1, n2-y2+1)*(theta1>theta2)),0,

给出:

from scipy import stats
import scipy.integrate as integrate

y1 = 90; n1 = 100; y2 = 2; n2 = 2;

result1 = integrate.dblquad(lambda theta1, theta2: (stats.beta.pdf(theta1, y1+1, n1-y1+1)*stats.beta.pdf(theta2,y2+1, n2-y2+1)*(theta1>theta2)),0,1, lambda x: 0, lambda x:1)

result2=integrate.quad(lambda theta1: (stats.beta.pdf(theta1, y1+1, n1-y1+1)*stats.beta.cdf(theta1,y2+1, n2-y2+1)),0,1)
为什么这些不同?除非我遗漏了什么,否则累积密度函数到任意点的值与pdf到该点的积分相同,因此
stats.beta.pdf(theta2,y2+1,n2-y2+1)*(theta1>theta2)
应该给出到该点的cdf,例如:

>>result1 
1.916...
>>result2
0.71..
>打印integrate.quad(lambda theta2:stats.beta.pdf(theta2,y2+1,n2-y2+1)*(theta2>打印stats.beta.cdf(0.9,y2+1,n2-y2+1)
0.729
第一个术语显然是相同的,那么为什么(很大)差异呢

此代码来自Kevin Murphy优秀著作中的一个示例,附带的matlab代码如下:

他的书将0.71作为答案,但他使用第一种方法进行计算。我没有matlab,因此无法确认这不是书和他的代码中的错误,但不清楚为什么不正确

方法2来自第一页的解析解:

编辑:

另外,以下梯形规则的实现给出了正确的(分析)答案


func=lambda theta1:integrate.quad(lambda theta2:stats.beta.pdf(theta2,y2+1,n2-y2+1)*(theta2当我使用scipy版本0.17.0运行代码时,我得到
result1=(0.7125919475596585,6.966216639647053e-07)
运行
integrate.dblquad(lambda theta1,theta2:(beta.pdf(theta1,y1+1,n1-y1+1)*.pdf)*.pdf(θ2,y2+1,n2-y2+1)),0,1,lambda x:x,lambda x:1)
?这与方法1类似,只是它利用
gfun
/
hfun
参数来塑造域。对我来说,这返回
(0.7125928041119365,1.0430449655332195e-10)
>integrate.dblquad(lambda theta1,theta2:(stats.beta.pdf(θ1,y1+1,n1-y1+1)*stats.beta.pdf(θ2,y2+1,n2-y2+1),0,1,lambda x:x,lambda x:1)(0.7125928041119366,1.0789513156470496e-10)>>integrate.dblquad(lambdaθ1,θ2:(stats.beta.pdf(θ1,y1+1,n1-y1+1)*stats.beta.pdf(θ2,y2+1)*(当我运行代码时,使用SCIT1<0(0.7125919475596585,6.966216639647053e-07)
运行integrate.dblquad(lambda theta1,theta2:(beta.pdf(theta1,y1+1,n1-y1+1)*beta.pdf(theta2,y2+1,n2-y2+1)),0,1,lambda x:x,lambda x:1)
?这与方法1类似,只是它利用
gfun
/
hfun
参数来塑造域。对我来说,这返回
(0.7125928041119365,1.0430449655332195e-10)
>integrate.dblquad(lambda theta1,theta2:(stats.beta.pdf(theta1,y1-y1+1)*stats.beta.pdf(theta2,y2+1)),0,1,lambda x:x,lambda x:1)(0.7125928041119366,1.0789513156470496e-10)>>>integrate.dblquad(lambda theta1,theta2:(stats.beta.pdf(theta1,y1+1,n1-y1+1)*stats.beta.pdf(theta2,y2+1,n2-y2+1)*(theta2)
>>print integrate.quad(lambda theta2: stats.beta.pdf(theta2,y2+1, n2-y2+1)*(theta2<0.9),0,1)
(0.7290000000000001, 8.093525849517392e-15)
>>print stats.beta.cdf(0.9,y2+1, n2-y2+1)

0.729
func = lambda theta1: integrate.quad(lambda theta2: stats.beta.pdf(theta2,y2+1, n2-y2+1)*(theta2<theta1),0,1)[0]*stats.beta.pdf(theta1,91,11)

step = 0.001
area=0
for x in np.arange(0,1,step):
    if((x==0)|(x==1-step)):
        area += func(x)
    else:
        area += 2*func(x)

area *= step/2
print area

0.7125...