Python:两个高斯卷积的结果函数的大小np.con公司

2024-10-16 22:30:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有兴趣优化一个函数,它是两个函数的卷积。主要的问题是,我得到的函数是完全有规模的,我不明白是什么np.卷积实际上是的。在

我写了一个小脚本,应该把两个高斯卷积起来,但是得到的高斯函数比输入函数大得多:

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

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

convolutionconvolution1


Tags: 函数importalphaplotasnpplt卷积
1条回答
网友
1楼 · 发布于 2024-10-16 22:30:43

你必须在两个x记号之间重新规范化dx。在

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应该只计算一次,因为积分会变成求和。如果你把它放在函数里面,它实际上会被计算两次,因为bot gaussian是用它生成的。在

enter image description here

注:为了更好地理解这一点,您可以尝试生成具有不同间距的x轴数据,而无需重新规范化,您将看到卷积的高度不同(间距越小,高度越大)

^{pr2}$

enter code hereenter image description here

相关问题 更多 >