Scipy:在整个表面进行积分时如何加速?

5
我有一个概率密度函数(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 来获取 F(x,y),这太慢了。
我想知道,由于结果是连续的(例如,您通过 F(4,4) 的值得到 F(5,6),并积分在这两点之间的区域),是否有可能加速该过程? 因此我们不必在每个点上从头开始运行 integrate ,从而使该过程更快。
可能有用的链接:

使用scipy在Python中计算多变量正态分布函数

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

我正在考虑从斐波那契数列借鉴一些东西

如何在Python中编写斐波那契数列


你真的需要多元正态分布(3个链接中的3个),还是一些通用分布?你尝试过直接使用Ffun=lambda x,y:integrate.nquad(f, [[-inf, x],[-inf, y]]); Fvals=[Ffun(x,y) for x,y in zip(xarr,yarr)],然后按照你所说的,在双重循环中从x[i-1]积分到x[i],并进行比较吗? - Andras Deak -- Слава Україні
@AndrasDeak,我需要它进行普遍分发。速度非常慢,因为我的一个 pdf 是作为 kdf (http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KernelDensity.html#sklearn.neighbors.KernelDensity.score_samples) 的瓶颈。multivariate normal 的 pdf 比那个快得多。 - ZK Zhao
1个回答

0
最终,这是我所做的:
F 是累积分布函数,f 是概率密度函数
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

这只是一个非常粗略的近似值,你可以通过将 +/- 方程转换为积分来完善结果。

至于原始值和边际值 cdf[0,:] cdf[:,0],你也可以使用积分。在我的情况下,它非常小,所以我只使用了 PDF 值。

你可以通过绘制 cdf 或检查 cdf[n,n] 处的值来测试该函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接