有很多方法可以将高斯函数拟合到数据集上。我通常在拟合数据时使用astropy,这就是我想把它作为附加答案添加的原因。
我使用一些数据集来模拟带有一些噪声的高斯分布:
import numpy as np
from astropy import modeling
m = modeling.models.Gaussian1D(amplitude=10, mean=30, stddev=5)
x = np.linspace(0, 100, 2000)
data = m(x)
data = data + np.sqrt(data) * np.random.random(x.size) - 0.5
data -= data.min()
plt.plot(x, data)
那么适配其实非常简单,您只需指定要拟合数据的模型和适配器:
fitter = modeling.fitting.LevMarLSQFitter()
model = modeling.models.Gaussian1D()
fitted_model = fitter(model, x, data)
并且绘制:
plt.plot(x, data)
plt.plot(x, fitted_model(x))
但是你也可以只使用Scipy,但你需要自己定义函数:
from scipy import optimize
def gaussian(x, amplitude, mean, stddev):
return amplitude * np.exp(-((x - mean) / 4 / stddev)**2)
popt, _ = optimize.curve_fit(gaussian, x, data)
这将返回最佳拟合参数,您可以像这样绘制它:
plt.plot(x, data)
plt.plot(x, gaussian(x, *popt))