python - Scipy:在对整个表面进行集成时加快集成速度?

标签 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]])

现在,我需要 x-y 面板中的整个 F(x,y),如下所示:

enter image description here

我该怎么做?


主要问题是,对于从 (-30,-30)(30,30) 的每个点,我都需要做一个 integrate.nquad 从头开始​​ 以获得F(x,y)。这太慢了。

我想知道,因为结果是连续的(例如,您通过 F(4,4) 的值得到 F(5,6),并从这两点之间的区域整合),是否有可能加快这个过程?因此,我们不需要在每个点都从头开始集成,从而使过程更快。


可能有用的链接:

Multivariate Normal CDF in Python using scipy

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

我正在考虑借鉴斐波那契数列

How to write the Fibonacci Sequence in Python

最佳答案

最后,这就是我所做的:

F是cdf,f是pdf

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

然后循环遍历整个surface,就可以得到结果。

代码看起来像这样:

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] 的值>

关于python - Scipy:在对整个表面进行集成时加快集成速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35112601/

相关文章:

python - 可以计算一个列表中多个字符串的匹配次数吗?

python - 为什么我不能声明一个在 mojo 中不会突变/改变的变量

Python 列表插入函数和数据类型问题

python - 计算 "distance matrix"

java - 我需要将 void 输出转换为字符串,以便我可以比较两个字符串

java - 字符串索引越界错误

python - 将数据从 Django 发送到另一台服务器

javascript - 使用请求登录到具有 javascript 登录表单的网站

python - 如何在 Python 中高效计算两个高斯分布的热图?

recursion - 为什么这个 F# 内部函数不是尾递归的?