我正在尝试使用scipy.optimize.curve\u fit优化指数拟合。但结果并不好。我的代码是:
def func(x, a, b, c):
return a * np.exp(-b * x) + c
# xdata and data is obtain from another dataframe and their type is nparray
xdata =[36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70 ,71,72]
ydata = [4,4,4,6,6,13,22,22,26,28,38,48,55,65,65,92,112,134,171,210,267,307,353,436,669,669,818,1029,1219,1405,1617,1791,2032,2032,2182,2298,2389]
popt, pcov = curve_fit(func, xdata, ydata)
plt.plot(xdata, func(xdata, *popt), 'r-', label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
plt.scatter(xdata, ydata, s=1)
plt.show()
然后我得到了这样的结果:
结果表明:
pcov = [[inf inf inf] [inf inf inf] [inf inf inf]]
popt = [1 1 611.83784]
我不知道如何使我的曲线拟合得很好。你能帮我吗?谢谢大家!
对指数函数进行拟合非常困难,因为指数的微小变化会导致结果的巨大差异。优化器在多个数量级上进行优化,与曲线上方的误差相比,原点附近的误差加权不相等
处理此问题的最简单方法是使用转换将指数数据转换为直线:
然后,您可以简单地使用numpy的polyfit函数拟合一条直线,而不需要使用更高级(更慢)的曲线拟合。如果愿意,可以将数据转换回线性空间进行分析。在这里,我编辑了您的代码,使用np.polyfit进行拟合,您可以看到拟合是合理的
方法不是寻找最佳点。要尝试的一件事是更改初始猜测,使b开始为负值,因为从您的数据来看,b必须为负值,以便
func
与之匹配。另外,从curve_fit
的文档中,如果没有指定,初始猜测默认为1。一个好的初步猜测是:给
情节呢
相关问题 更多 >
编程相关推荐