假设我在一个足够大的范围内具有概率密度函数,并且具有足够小的间距。我现在想要计算这两个概率密度函数的卷积乘积尽可能高效,目前我有以下函数:
def convolve_PDF(PDF1, PDF2, delta):
conv_PDF = np.empty(len(PDF1))
for n in range(len(conv_PDF)):
conv_PDF[n] = np.trapz(PDF1[0:(n+1)] * PDF2[n::-1], dx = delta)
return conv_PDF
delta = 0.001
s_range = np.arange(0,100,delta)
PDF1 = scipy.stats.expon(scale = 100).cdf(s_range)
PDF2 = scipy.stats.gamma(a = 1).cdf(s_range)
PDF_convol = convolve_PDF(PDF1, PDF2, delta)
此处delta
是间距。
你可能会说,这段代码很慢,我想知道如何加快速度呢?
答案 0 :(得分:0)
根据评论中的建议,可以使用scipy.signal.fftconvolve
快速解决此问题。特别是在每次迭代中都可以使用以下内容:
PDF_convolve = scipy.signal.fftconvolve(PDF1, PDF2)[0:len(PDF1)] * delta
PDF_convolve = PDF_convolve / np.trapz(PDF_convolve, dx = delta)
我们除以np.trapz(PDF_convolve, dx = delta)
,因为小错误可能导致PDF_convolve
没有积分到一个,而是接近一个接近一个的值,然后每个卷积放大此错误。