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...