将概率密度函数的乘积与Scipy集成

时间:2016-04-27 10:32:47

标签: 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,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)

给出:

>>result1 
1.916...
>>result2
0.71..

为什么这些不同?除非我遗漏了某些东西,否则累积密度函数到仲裁点的值与到目前为止的pdf的积分相同,因此stats.beta.pdf(theta2,y2+1, n2-y2+1)*(theta1>theta2)应该将cdf提供到该点,例如:

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

第一个词显然是一样的,为什么(大)差异?

此代码来自Kevin Murphys优秀书籍的示例,随附的matlab代码如下: https://github.com/probml/pmtk3/blob/master/demos/amazonSellerDemo.m

他的书以0.71作为答案,但他用第一种方法计算它。我没有matlab,所以无法确认这本书及其代码中的错误,但不清楚为什么它不正确。

方法2来自第一页的分析解决方案: http://www.johndcook.com/UTMDABTR-005-05.pdf

编辑:

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

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

0 个答案:

没有答案