快速计算两个概率密度函数的卷积乘积
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 的某个值,然后每次卷积都会放大此误差。
假设我在某个足够大的范围内具有足够小的间距的概率密度函数。我现在想尽可能高效地计算这两个概率密度函数的卷积乘积,目前我有以下函数:
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 的某个值,然后每次卷积都会放大此误差。