使用pyFFTW对两个PDF进行卷积

问题描述 投票:0回答:1

我想获得两个随机变量之和的众数和标准差。为此,我创建 PDF 的离散表示,并执行卷积以获得新的 PDF,从中计算众数和标准差。

我正在使用

scipy.signal.fftconvolve
,但是由于操作执行了大约400K次,所以这需要很多时间。

我想使用

pyFFTW
库来加快速度,但无法使其工作。据我了解,我需要:

  1. 计算两个 PDF 上的 FFT。
  2. 乘以 FFT。
  3. 计算 FFT 乘法的 IFFT。

雪上加霜的是,这两个分布都不以零为中心,也不对称。

可以在此处查看两个 PDF 和当前卷积的示例代码:https://gist.github.com/ajossorioarana/047202db9c2990b43cf7ba2e02735faf

重点部分是最后一节:

# Do the convolution with scipy.signal.fftconvolve
convolution_pdf = scipy.signal.fftconvolve(pdf1, pdf2, 'full')
convolution_pdf = convolution_pdf[0:len(pdf1)]

我尝试用以下代码替换上面的代码:

## Do the convovlution with pyfftw.builders
builder1 = pyfftw.builders.fft(pdf1)
builder2 = pyfftw.builders.fft(pdf2)

fft1 = builder1()
fft2 = builder2()

builder3 = pyfftw.builders.ifft(fft1*fft2)

convolution = builder3()
python convolution probability-density pyfftw
1个回答
0
投票

为了可能加快速度,您可以修补

scipy.signal.fftconvolve
以使用 pyFFTW 接口:

from timeit import Timer

import numpy
import pyfftw
import scipy.signal

# Planning first and enabling cache for optimization
shape = (1024, 512)
a = pyfftw.empty_aligned(shape, dtype="complex128")
b = pyfftw.empty_aligned(shape, dtype="complex128")
pyfftw.interfaces.cache.enable()

a[:] = numpy.random.randn(*shape) + 1j * numpy.random.randn(*shape)
b[:] = numpy.random.randn(*shape) + 1j * numpy.random.randn(*shape)

t = Timer(lambda: scipy.signal.fftconvolve(a, b))
print(f"Vanilla: {t.timeit(number=100):1.3f} seconds")

# Patching `fftpack` with `pyfftw.interfaces.scipy_fftpack`
scipy.fftpack = pyfftw.interfaces.scipy_fftpack
scipy.signal.fftconvolve(a, b)

print(f"Patched: {t.timeit(number=100):1.3f} seconds")

但是我并没有得到明显的改善。

pyFFTW 在处理大量数据数组时具有增强性能的潜力。然而,当涉及到在缩减的数据库上顺序迭代特定数量的操作时,事实证明改进是相当小的。

© www.soinside.com 2019 - 2024. All rights reserved.