快速计算两个概率密度函数的卷积乘积

Quickly compute the convolution product of two Probability Density Functions

假设我在某个足够大的范围内具有足够小的间距的概率密度函数。我现在想尽可能高效地计算这两个概率密度函数的卷积乘积,目前我有以下函数:

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是间距

您可能会说,这段代码非常慢,我想知道如何加快速度?

正如评论中所建议的,使用 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 不是积分为 1,而是积分接近 1 的某个值,然后每次卷积都会放大此误差。