【问题标题】:How do I perform a convolution in python with a variable-width Gaussian?如何在 python 中使用可变宽度高斯执行卷积?
【发布时间】:2013-09-08 13:27:13
【问题描述】:

我需要使用高斯执行卷积,但是高斯的宽度需要改变。我不是在做传统的信号处理,而是我需要根据我的设备的分辨率,使用我完美的概率密度函数 (PDF) 并“涂抹”它。

例如,假设我的 PDF 一开始是一个尖峰/增量函数。我将其建模为一个非常窄的高斯分布。通过我的设备运行后,它会根据一些高斯分辨率被涂抹掉。我可以使用 scipy.signal 卷积函数来计算它。

    import numpy as np
    import matplotlib.pylab as plt

    import scipy.signal as signal
    import scipy.stats as stats

    # Create the initial function. I model a spike
    # as an arbitrarily narrow Gaussian
    mu = 1.0 # Centroid
    sig=0.001 # Width
    original_pdf = stats.norm(mu,sig)

    x = np.linspace(0.0,2.0,1000) 
    y = original_pdf.pdf(x)
    plt.plot(x,y,label='original')


    # Create the ``smearing" function to convolve with the
    # original function.
    # I use a Gaussian, centered at 0.0 (no bias) and
    # width of 0.5
    mu_conv = 0.0 # Centroid
    sigma_conv = 0.5 # Width
    convolving_term = stats.norm(mu_conv,sigma_conv)

    xconv = np.linspace(-5,5,1000)
    yconv = convolving_term.pdf(xconv)

    convolved_pdf = signal.convolve(y/y.sum(),yconv,mode='same')

    plt.plot(x,convolved_pdf,label='convolved')
    plt.ylim(0,1.2*max(convolved_pdf))
    plt.legend()
    plt.show()

这一切都没有问题。但是现在假设我的原始 PDF 不是一个尖峰,而是一些更广泛的功能。例如,sigma=1.0 的高斯分布。现在假设我的分辨率实际上在 x 上变化:在 x=0.5 时,拖尾函数是 sigma_conv=0.5 的高斯函数,但在 x=1.5 时,拖尾函数是 sigma_conv=1.5 的高斯函数。假设我知道我的涂抹高斯的 x 依赖的函数形式。天真地,我以为我会将上面的行更改为

    convolving_term = stats.norm(mu_conv,lambda x: 0.2*x + 0.1)

但这不起作用,因为 norm 函数需要一个宽度值,而不是函数。从某种意义上说,我需要我的卷积函数是一个二维数组,其中我的原始 PDF 中的每个点都有不同的拖尾高斯分布,它仍然是一个一维数组。

那么有没有办法用 Python 中定义的函数已经做到这一点?我有一些我自己写的代码来做这件事……但我想确保我不只是重新发明了轮子。

提前致谢!

马特

【问题讨论】:

  • 您的 xconv "step" (last - first) / (length - 1) 与 x "step" 不同会使宽度缩放(即,sigma 不在同一个“单位”中),您真的想要吗?跨度>
  • "我有一些我自己写的代码来做这件事" => 你能告诉我们这段代码吗?这可能会有所帮助。

标签: python signal-processing resolution convolution probability-density


【解决方案1】:

问题,简而言之:
如何与非平稳内核进行卷积,例如针对数据中不同位置改变宽度的高斯,以及 Python 是否是用于此目的的现有工具?

答案,排序:
很难证明是否定的,但我认为 scipy 或 numpy 中不存在使用非平稳内核执行卷积的函数。反正按照你的描述,它并不能真正很好地向量化,所以你还不如做一个循环或者写一些自定义的C代码。

可能对您有用的一个技巧是,使用反向比例拉伸数据(即,在您希望高斯与为 0.5 基本宽度,将数据拉伸到 2 倍)。这样,您可以对数据进行单次变形操作,即具有固定宽度高斯的标准卷积,然后将数据解变形为原始比例。

这种方法的优点是它非常容易编写,并且是完全矢量化的,因此运行起来可能相当快。

扭曲数据(例如,使用插值方法)会导致一些准确性损失,但如果您选择的方式是在初始扭曲操作中始终扩展数据而不是减少数据,则损失应该是最小的。

【讨论】:

    猜你喜欢
    • 2020-09-29
    • 2021-10-15
    • 1970-01-01
    • 2018-10-03
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2013-06-08
    相关资源
    最近更新 更多