更新:问题已解决!
现在它能够生成带有正确符号的参数,并且它们确实适合曲线。问题在于定义了func(a,b,c,x),但是curve_fit需要先读取x: func(x,a,b,c)。感谢大家的帮助!今天我和老板会有定量分析 :)
这里是一些新拟合:http://imgur.com/NHnzR2A
(我仍然会得到运行时错误:
RuntimeWarning: overflow encountered in power
return a*(math.e**(b*(math.e**(c*x))))
)
有人能帮我找出这段代码的问题吗?我是scipy的新手。 我试图使用Gompertz方程模拟细菌生长,但我的代码产生了完全错误的curve_fit。您可以在this imgur album中看到我的真实数据、模型方程和此代码生成的拟合图形。 谢谢!
修复后的代码:
#!/usr/bin/python
from numpy import *
from scipy.optimize import curve_fit
values = numpy.asarray(values)
y = values[:2000//5].astype(numpy.float)
y - y[0] #subtracting blank value
x = numpy.arange(len(y))*5
def Function(x,a,b,c):
#a = upper asymptote
#b = negative = x axis displacement
#c = negative = growth rate
return a*(math.e**(b*(math.e**(c*x))))
parameters, pcov = curve_fit(Function, x, y, p0=[0.1,-1300,-0.0077])
#Graph data and fit to compare
yaj = Function( numpy.asarray(x), parameters[0], parameters[1], parameters[2] )
figure(1, figsize=(8.5,11))
subplot(211)
plot(x,y,'g-')
xlim(min(x),max(x))
ylim(min(y),max(y))
subplot(212)
plot(x,yaj,'r-')
xlim(min(x),max(x))
ylim(min(yaj),max(yaj))
savefig('tempgraph.pdf')
return parameters
a=0.0001,b=-20,c=40000000
),则需要进行归一化处理。否则,通过有限差分计算雅可比矩阵会非常不准确,并且解决方案将无法正确收敛。此外,如果您可以在某个地方发布您的数据样本(例如 pastebin 等),则可以帮助诊断问题(例如每 100 个样本一个,如果它非常大)。 - Joe Kingtoncurve_fit
接受一个初始猜测作为参数 (p0
)。默认情况下,它是全 1。如果a=1, b=1, c=1
与 a、b 和 c 的实际值相差甚远,则需要提供更合理的值。 - Joe Kington