我感兴趣优化的函数,而两个函数的卷积。主要的问题是,我得到的函数是完全地规模的,我不明白是什么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()
卷积后产生的高斯要高得多
比我的预期(维基百科):
你们两个之间得重新归一化的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应该因为整体进入求和来只计算一次。如果你把它的函数内部它实际上将被两次,因为机器人高斯都用它产生计数。
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()