python概率密度函数_Python中概率密度函数的快速卷积

您可以使用快速傅立叶变换(FFT)有效地计算所有PDF的卷积:关键事实是,FFT of the convolution是单个概率密度函数FFT的乘积。因此,转换每个PDF,将转换后的PDF相乘,然后执行逆变换。您需要用0填充每个输入PDF到适当的长度,以避免换行的影响。在

这应该是相当有效的:如果您有m个pdf,每个pdf都包含n个条目,那么使用此方法计算卷积的时间应该增长为(m^2)n log(mn)。时间由fft控制,我们有效地计算m + 1独立的fft(m正变换和一个逆变换),每个fft的长度不超过mn。但和往常一样,如果你想要真正的时间安排,你就应该进行分析。在

下面是一些代码:import numpy.fft

def convolve_many(arrays):

"""

Convolve a list of 1d float arrays together, using FFTs.

The arrays need not have the same length, but each array should

have length at least 1.

"""

result_length = 1 + sum((len(array) - 1) for array in arrays)

# Copy each array into a 2d array of the appropriate shape.

rows = numpy.zeros((len(arrays), result_length))

for i, array in enumerate(arrays):

rows[i, :len(array)] = array

# Transform, take the product, and do the inverse transform

# to get the convolution.

fft_of_rows = numpy.fft.fft(rows)

fft_of_convolution = fft_of_rows.prod(axis=0)

convolution = numpy.fft.ifft(fft_of_convolution)

# Assuming real inputs, the imaginary part of the output can

# be ignored.

return convolution.real

把这个应用到你的例子中,我得到的结果是:

^{pr2}$

这是基本的想法。如果您想对此进行调整,还可以看看^{}(及其逆函数,^{}),它利用了输入是实的这一事实,从而生成更紧凑的变换数组。您还可以通过在rows数组中填充0来获得一些速度,这样列的总数对于执行FFT是最佳的。这里“最优”的定义将取决于FFT的实现,但是例如,2的幂次是很好的目标。最后,在创建rows时,如果所有的输入数组都具有相同的长度,可以进行一些明显的简化。但我将把这些潜在的改进留给你。在

你可能感兴趣的:(python概率密度函数)