Python的:得到的两个高斯与np.convolve卷积功能的大小

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

我感兴趣优化的函数,而两个函数的卷积。主要的问题是,我得到的函数是完全地规模的,我不明白是什么np.convolve实际上做。

我写了一个小脚本,应该卷积两个高斯,但由此产生的高斯是在尺寸上比输入功能要大得多:

from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
import numpy as np


# https://stackoverflow.com/questions/18088918/combining-two-gaussians-into-another-guassian
def gauss(x, p): # p[0]==mean, p[1]==stdev, p[2]==heightg, p[3]==baseline                   
    a = p[2]
    mu = p[0]
    sig = p[1]
    #base = p[3]
    return a * np.exp(-1.0 * ((x - mu)**2.0) / (2.0 * sig**2.0)) #+ base

p0 = [0, 0.3, 1] # Inital guess is a normal distribution
p02 = [0, 0.2, 0.5]


xp = np.linspace(-4, 4, 2000)
convolved = np.convolve(gauss(xp, p0),gauss(xp, p02), mode="same")


fig = plt.figure()



plt.subplot(2, 1, 1)

plt.plot(xp, gauss(xp, p0), lw=3, alpha=2.5)
plt.plot(xp, gauss(xp, p02), lw=3, alpha=2.5)
plt.xlim([-2, 2])

plt.subplot(2, 1, 2)
plt.plot(xp, gauss(xp, p0), lw=3, alpha=2.5)
plt.plot(xp, gauss(xp, p02), lw=3, alpha=2.5)
plt.plot(xp, convolved, lw=3, alpha=2.5,label="too damn high?")
plt.legend()
plt.xlim([-2, 2])

plt.tight_layout()
plt.show()

卷积后产生的高斯要高得多

Result

比我的预期(维基百科):

python numpy convolution gaussian
1个回答
2
投票

你们两个之间得重新归一化的DX X蜱。

NumPy的被取代的总和整合,但由于功能只需要Y值不关心上,您需要手动包括集成轴体积元。 我不得不处理这个问题,以及它是一个痛苦,当你开始做的东西与DX = 1,比突然的你,因为不同的x轴分布的一个错误的结果。

xp = np.linspace(-4, 4, 2000)
dx = xp[1] - xp[0]
convolved = np.convolve(gauss(xp, p0),gauss(xp, p02), mode="same") * dx

!注意:不要把重整化的函数定义里面。 DX应该因为整体进入求和来只计算一次。如果你把它的函数内部它实际上将被两次,因为机器人高斯都用它产生计数。

enter image description here

PS:要尝试理解这更好的,你可以尝试生成具有不同的间距和无重整化,你会看到你的卷积的高度会有所不同(较小的间距越大,高度)x轴数据

fig = plt.figure()
ax = fig.add_subplot(111)
for spacing in (100,500,1000,2000):
    spacing += 1
    xp = np.linspace(-4, 4, spacing)
    dx = xp[1] - xp[0]
    convolved = np.convolve(gauss(xp, p01),gauss(xp, p02), mode="same") * dx
    ax.plot(xp, convolved, lw=3, alpha=2.5,label="spacing = {:g}".format(8/spacing))

ax.set_title("Convolution with different x spacing. With renormalization")
fig.legend()
plt.show()

enter code here enter image description here

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