因此,我正在尝试使用以下幂定律来拟合一组数据:
def f(x,N,a): # Power law fit
if a >0:
return N*x**(-a)
else:
return 10.**300
par,cov = scipy.optimize.curve_fit(f,data,time,array([10**(-7),1.2]))
其他条件只是迫使a为正。使用scipy.optimize.curve_fit会产生an awful fit (green line),对于N和a分别返回1.2e + 04和1.9e0-7的值,并且与数据绝对没有交集。根据我手动输入的拟合值,N和a的值应分别落在1e-07和1.2左右,尽管将它们放到curve_fit中是因为初始参数不会改变结果。删除条件为正的条件会导致拟合度变差,因为选择负值会导致符号斜率拟合错误。
我无法弄清楚如何从该例程中获得可信的,更不用说可靠的拟合,但是我找不到任何其他好的Python曲线拟合例程。我需要编写自己的最小二乘算法还是在这里做错了什么?
参考方案
更新
在原始帖子中,我展示了一个使用lmfit的解决方案,该解决方案允许为您的参数分配界限。从版本0.17开始,scipy还允许直接为参数分配范围(请参见documentation)。请在EDIT之后找到下面的解决方案,该解决方案有望作为有关如何使用scipy的curve_fit和参数范围的最小示例。
原始帖子
正如@Warren Weckesser所建议的那样,您可以使用lmfit完成此任务,这使您可以为参数分配范围,并避免出现这种“难看的” if子句。
由于您不提供任