Scipy:在整个表面上进行加速整合?

时间:2016-01-31 10:07:45

标签: python numpy recursion scipy

我有概率密度函数(pdf) f(x,y)。要在点(x,y)处获得累积分布函数(cdf) F(x,y),您需要集成f(x,y),如下所示: enter image description here

Scipy中,我可以integrate.nquad

执行此操作
x, y=5, 4
F_at_x_y = integrate.nquad(f, [[-inf, x],[-inf, y]])

现在,我需要F(x,y)面板中的整个x-y,看起来像这样:

enter image description here

我该怎么做?

主要问题是,对于从(-30,-30)(30,30)的每个点,我需要从头开始 integrate.nquad 来获取{{ 1}}。这太慢了。

我想知道,因为结果是连续的(例如,你得到F(x,y) F(5,6)的值,并从这两个点之间的区域整合),如果有可能加快这个过程?因此,我们不需要在任何时候从头开始F(4,4) ,从而使流程更快。

可能有用的链接:

Multivariate Normal CDF in Python using scipy

http://cn.mathworks.com/help/stats/mvncdf.html

我正在考虑借用 Fibonacci序列

中的东西

How to write the Fibonacci Sequence in Python

1 个答案:

答案 0 :(得分:0)

最后,这就是我所做的:

F是cdf,f是pdf

F(5,5)= F(5,4)+ F(4,5) - 2 * F(4,4)+ f(5,5)

循环遍及整个表面,你可以得到结果。

代码如下所示:

def cdf_from_pdf(pdf):
    if not isinstance(pdf[0], np.ndarray):
        original_dim = int(np.sqrt(len(pdf)))
        pdf = pdf.reshape(original_dim,original_dim)
    cdf = np.copy(pdf)
    xdim, ydim = cdf.shape
    for i in xrange(1,xdim):
         cdf[i,0] =  cdf[i-1,0] +  cdf[i,0]
    for i in xrange(1,ydim):
         cdf[0,i] =  cdf[0,i-1] +  cdf[0,i]
    for j in xrange(1,ydim):
        for i in xrange(1,xdim):
             cdf[i,j] =  cdf[i-1,j] +  cdf[i,j-1] -  cdf[i-1,j-1] + pdf[i,j]
    return cdf

这是一个非常粗略的近似值,您可以通过将+/- equantion更改为积分来完善结果。

对于原始值和边距cdf[0,:]cdf[:,0],您也可以使用集成。就我而言,它非常小,所以我只使用pdf值。

您可以通过绘制cdf来测试该功能,或检查cdf[n,n]

处的值