【发布时间】:2019-11-21 08:30:41
【问题描述】:
我正在尝试自动将高斯拟合到数据中,但 scipy 似乎无法拟合仅显示一半曲线的数据。但是,Scipy 似乎无法做到这一点。
高斯曲线数据右侧的样子: https://i.imgur.com/LwzN2Jd.png
我尝试使用下面的代码来拟合曲线。它非常适合完全曲线。但是对于半曲线,它会变平
'''
plotData = {}
#x = 0,2.5,5
#y = 16766,508,600.6
modelDataDf = df.loc[:,["x","y"]]
modelDataDf.sort_values(by=["x"],inplace=True)
modelData = modelDataDf.to_dict(orient="list")
def _1gaussian(x, amp1,cen1,sigma1):
return amp1*(1/(sigma1*(np.sqrt(2*np.pi))))*(np.exp(-((x-cen1)**2)/((2*sigma1)**2)))
x_array = np.asarray(modelData["x"])
y_array_gauss = np.asarray(modelData["y"])
amp1 = 29000
sigma1 = 1
cen1 = -1
popt_gauss, pcov_gauss = scipy.optimize.curve_fit(_1gaussian, x_array, y_array_gauss, p0=[amp1, cen1, sigma1])
perr_gauss = np.sqrt(np.diag(pcov_gauss))
plotData["xGaussCurve"] = np.arange(0, 5.05, 0.05)
plotData["yGaussCurve"] = _1gaussian(plotData["xGaussCurve"],*popt_gauss)
'''
合身的样子: https://i.imgur.com/0gfqiRF.png
它卡住的半高斯: https://i.imgur.com/Jsi4fzA.png
蓝点表示数据,粗红线表示我希望它显示的拟合,红色虚线表示拟合失败。
我得到错误:
RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 800.
当试图拟合半高斯时。
【问题讨论】:
-
不确定它是否会起作用,但您可以尝试修改
_1gaussian函数,使其仅建模一半(通过与0 if x < cen1 else 1相乘)。 -
3 个数据点肯定不足以获得良好的拟合......特别是,如果在 0 和最大值之间(在 x=0 处)高度处没有点,则没有什么可以确定高斯的宽度(它可能非常非常薄或“尽可能大”,这也没有很好的定义)
标签: python scipy curve-fitting gaussian