繁体   English   中英

为什么在尝试使用curve_fit将高斯/洛伦兹拟合到数据时出现OptimizeError?

[英]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

总之:

  1. 为您的拟合算法提供初始猜测,并尽可能提供界限。
  2. 始终绘制模型和数据以查看发生了什么。
  3. 请注意模型的限制,它可以或不能达到的值。 首先使用它来评估是否适合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM