我有两个NumPy数组x
和y
。当我尝试使用指数函数和curve_fit
(SciPy)来拟合我的数据时,
#!/usr/bin/env python
from pylab import *
from scipy.optimize import curve_fit
x = np.array([399.75, 989.25, 1578.75, 2168.25, 2757.75, 3347.25, 3936.75, 4526.25, 5115.75, 5705.25])
y = np.array([109,62,39,13,10,4,2,0,1,2])
def func(x, a, b, c, d):
return a*np.exp(b-c*x)+d
popt, pcov = curve_fit(func, x, y)
我得到错误的系数popt
[a,b,c,d] = [1., 1., 1., 24.19999988]
有什么问题吗?
2条答案
按热度按时间8ehkhllq1#
第一条评论:因为
a*exp(b - c*x) = (a*exp(b))*exp(-c*x) = A*exp(-c*x)
、a
或b
是冗余。我将删除b
和用途:这不是主要问题。问题很简单,当你使用默认的初始猜测(全是1)时,
curve_fit
无法收敛到这个问题的解。检查pcov
;你会看到它是inf
。这并不奇怪,因为如果c
为1,则exp(-c*x)
的大部分值下溢为0:这表明
c
应该很小。一个更好的初始猜测是,比如说,p0 = (1, 1e-6, 1)
。然后我得到:这看起来很合理:
z9gpfhce2#
首先,我建议将你的方程修改为
a*np.exp(-c*(x-b))+d
,否则指数将始终以x=0
为中心,这可能并不总是如此。您还需要指定合理的初始条件(curve_fit
的第4个参数指定[a,b,c,d]
的初始条件)。这段代码非常适合: