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

时间:2018-01-16 22:44:37

标签: python numpy scipy convolution

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

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

你可能会说,这段代码很慢,我想知道如何加快速度呢?

1 个答案:

答案 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没有积分到一个,而是接近一个接近一个的值,然后每个卷积放大此错误。