[英]why am I getting OptimizeError while trying to fit a gaussian/lorentzian to data using curve_fit?
我正在尝试使用 scipy 优化曲线拟合函数来拟合可能适合高斯或洛伦兹的数据集。 我收到错误消息:“OptimizeWarning:无法估计参数的协方差warnings.warn('无法估计参数的协方差'”,数据集如下所示:在此处输入图像描述
如您所见,它可能适合高斯。 我的代码是:
def gaussian(x,a,b,c,d):
func=a*np.exp(-((x-b)**2)/c)+d
return func
def lorentzian (x,a,b,c):
func=a/(((x-b)**2+a**2)*np.pi)+c
return func
x,y_data= np. loadtxt('in 0.6 out 0.6.dat', unpack = True)
popt, pcov = curve_fit(lorentzian, x, y_data)
谢谢你!
您收到此错误是因为拟合算法找不到合适的解决方案。 无论将参数移动到哪里,拟合质量都不会改变。 如果您提供初始猜测,您更有可能找到解决方案。 鉴于函数参数相对容易通过浏览曲线获得,您可以提供其中的大部分。 例如,中心(你称之为a
)大约是 545.5。 Wikipedia 还与您的方程的稍微不同形式的最大值有关系,该方程缺少c
参数来向上移动曲线。 提供猜测p0 = (0.1, 545.5, 0)
和(0, 1E10)
的界限,您会得到更接近结果的结果,但仍然不能令人满意(下一次,提供数据数组,我不得不使用点提取器来绘制这个)
现在,请注意您应该如何达到最大值 40,但您的模型似乎无法实现。 我冒昧地将您的模型正常化,只需将其除以最大值并尝试再次拟合即可。 我不知道这是否是适当的标准化,但这只是为了说明差异。 这一次,结果令人满意得多:
然而我认为洛伦兹对于你的曲线来说有点太窄了(如果你将c
设置为 0 尤其明显),它看起来更像是一个高斯(假设你提供了它的定义但没有使用它,我想你可能会有以后用过)。
请注意我不必标准化y
。
总之:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.