从python scipy.optimize.curve\u fit获得完全错误的拟合

从python scipy.optimize.curve\u fit获得完全错误的拟合,python,numpy,scipy,curve-fitting,data-fitting,Python,Numpy,Scipy,Curve Fitting,Data Fitting,更新:解决! 它现在正在生成具有正确符号的参数,并且它们确实符合曲线。问题是定义func(a,b,c,x),但曲线拟合需要先读取x:func(x,a,b,c)。谢谢大家的帮助!今天见老板时,我会进行定量分析:) 以下是一些新的搭配: (我仍然得到一个运行时错误: RuntimeWarning: overflow encountered in power return a*(math.e**(b*(math.e**(c*x)))) ) 有人能帮我找出这个代码的错误吗?我是新来的。 我试图用这个

更新:解决! 它现在正在生成具有正确符号的参数,并且它们确实符合曲线。问题是定义func(a,b,c,x),但曲线拟合需要先读取x:func(x,a,b,c)。谢谢大家的帮助!今天见老板时,我会进行定量分析:)

以下是一些新的搭配:

(我仍然得到一个运行时错误:

RuntimeWarning: overflow encountered in power
return a*(math.e**(b*(math.e**(c*x))))
)


有人能帮我找出这个代码的错误吗?我是新来的。 我试图用这个模型来模拟细菌的生长,但我的代码产生了一个完全错误的曲线拟合。您可以看到我的真实数据、模型方程以及该代码生成的拟合的图像 谢谢


固定代码:

#!/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
进口:

import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as opt
样本值:

values = np.array('0.400    0.400   0.397   0.395   0.396   0.394   0.392   0.390   0.395   0.393   0.392   0.392   0.390   0.388   0.390   0.388   0.385   0.383   0.388   0.387   0.387   0.387   0.385   0.386   0.387   0.379   0.379   0.378   0.375   0.376   0.374   0.373   0.372   0.368   0.373   0.370   0.371   0.370   0.370   0.370   0.367   0.368   0.368   0.365   0.365   0.366   0.364   0.361   0.361   0.356   0.355   0.357   0.354   0.353   0.350   0.351   0.353   0.355   0.350   0.354   0.352   0.351   0.348   0.348   0.347   0.345   0.346   0.343   0.348   0.346   0.344   0.343   0.342   0.341   0.346   0.346   0.345   0.343   0.348   0.345   0.346   0.342   0.344   0.344   0.340   0.341   0.345   0.345   0.343   0.339   0.343   0.344   0.343   0.346   0.344   0.344   0.345   0.347   0.344   0.344   0.338   0.340   0.343   0.340   0.342   0.336   0.334   0.336   0.337   0.338   0.338   0.343   0.342   0.342   0.336   0.334   0.336   0.330   0.325   0.324   0.323   0.319   0.323   0.322   0.318   0.314   0.314   0.319   0.315   0.316   0.313   0.315   0.314   0.314   0.315   0.313   0.308   0.312   0.311   0.310   0.312   0.311'
                  ' 0.311   0.309   0.309   0.316   0.317   0.312   0.309   0.311   0.308   0.310   0.312'.split('\t'), dtype=float)
旧数据准备:

x=[]
y=[]
x_val = 0
for i in values: #values is a list of several thousand experimental data points
  if x_val < 100:
    x.append(float(x_val))
    y.append(float(i))
  x_val += 5
x = np.asarray(x)
y = np.asarray(y)
检查是否相同:

print np.allclose(y, y1)
print np.allclose(x, x1)
使用numpy定义拟合函数:

def function(x, a,b,c):
    #a = upper asymptote
    #b = negative = x axis displacement
    #c = negative = growth rate
    return a*(np.exp(b*(np.exp(c*x))))
使用起点p0进行拟合:

pars, pcov = opt.curve_fit(function, x1, y1, p0=[0.1, -10, 0.1])
抽签:


这是一个非线性解算器,因此它对初始猜测具有内在的敏感性。你试过做出更好的初步猜测吗?此外,如果模型参数的变化幅度超过几个数量级(例如,
a=0.0001,b=-20,c=40000000
),则需要对其进行规范化。否则,通过有限差分计算雅可比矩阵将非常不准确,并且解不会正确收敛。此外,如果你能将你的数据样本发布到某个地方(如pastebin等),这将有助于诊断问题(可能每100个样本,或者类似的,如果样本非常大)。我如何进行初步猜测?实际上,a、b和c是未定义的。模型参数都应该是相同的数量级。它们的符号与预期值相反。
曲线拟合
将初始猜测作为参数(
p0
)。默认情况下,都是1。如果
a=1,b=1,c=1
与a,b和c的可能值相差甚远,那么您需要提供更合理的数据。以下是我的一个数据集:From:model函数,f(x,…)。它必须将自变量作为第一个参数,将要拟合的参数作为单独的剩余参数。您好,谢谢您的帮助!问题是我定义的是函数(a,b,c,x),而x必须先出现才能使曲线拟合。是的,这就是我在评论中写的:-)
pars, pcov = opt.curve_fit(function, x1, y1, p0=[0.1, -10, 0.1])
yaj = function(x1, *pars)
plt.figure(1, figsize=(8.5, 11))
plt.plot(x1, y1, 'g-', x1, yaj, 'r-')
plt.xlim(min(x1), max(x1))
plt.ylim(min(y1), max(y1))
plt.show()