我有一个概率密度函数 (pdf) f(x,y)
。并且要获得它在点 (x,y) 的累积分布函数 (cdf)F(x,y)
,您需要积分 f(x, y)
,像这样:
在 Scipy
中,我可以通过 integrate.nquad
来完成:
x, y=5, 4
F_at_x_y = integrate.nquad(f, [[-inf, x],[-inf, y]])
现在,我需要 x-y
面板中的整个 F(x,y)
,如下所示:
我该怎么做?
主要问题是,对于从 (-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
我正在考虑借鉴斐波那契数列
最佳答案
最后,这就是我所做的:
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/