我有概率密度函数(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]])
现在,我需要F(x,y)
面板中的整个x-y
,看起来像这样:
我该怎么做?
主要问题是,对于从(-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序列
中的东西答案 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]