我正在尝试使用Python来将曲线拟合到一系列数据点,总结如下:
从下面看,似乎大于2的多项式是最佳拟合,其次是线性和最终指数,其具有总体最差结果 .
虽然我意识到这可能不是指数增长,但我只是想知道你是否会期望指数函数表现如此糟糕(基本上x,b的系数已被设置为0并且已经在曲线上选择了任意点如果我在某些方面做错了我的代码以适应 .
我用来拟合的代码如下:
# Fitting
def exponenial_func(x,a,b,c):
return a*np.exp(-b*x)+c
def linear(x,m,c):
return m*x+c
def quadratic(x,a,b,c):
return a*x**2 + b*x+c
def cubic(x,a,b,c,d):
return a*x**3 + b*x**2 + c*x + d
x = np.array(x)
yZero = np.array(cancerSizeMean['levelZero'].values)[start:]
print len(x)
print len(yZero)
popt, pcov = curve_fit(exponenial_func,x, yZero, p0=(1,1,1))
expZeroFit = exponenial_func(x, *popt)
plt.plot(x, expZeroFit, label='Control, Exponential Fit')
popt, pcov = curve_fit(linear, x, yZero, p0=(1,1))
linearZeroFit = linear(x, *popt)
plt.plot(x, linearZeroFit, label = 'Control, Linear')
popt, pcov = curve_fit(quadratic, x, yZero, p0=(1,1,1))
quadraticZeroFit = quadratic(x, *popt)
plt.plot(x, quadraticZeroFit, label = 'Control, Quadratic')
popt, pcov = curve_fit(cubic, x, yZero, p0=(1,1,1,1))
cubicZeroFit = cubic(x, *popt)
plt.plot(x, cubicZeroFit, label = 'Control, Cubic')
*编辑:curve_fit从scipy.optimize包导入
from scipy.optimize import curve_fit
2 回答
如果你用一个像指数这样的函数给出一个很差的初始猜测,如果你的函数结果非常大,那么curve_fit往往表现不佳 . 您可以尝试更改maxfev输入,以便运行更多迭代 . 否则,我建议尝试使用类似的东西:
-.01,因为它从300增加到500,你的eqn中有-b,100 0因为它在300时为3000(从0增加1.5倍) . 看看结果如何
至于为什么初始指数根本不起作用,你的初始猜测是b = 1,x在
(300,1000)
或范围的范围内 . 这意味着python正在计算exp(-300)
,它会抛出异常或设置为0.此时,无论b是增加还是减少,对于初始估计的一般附近的任何值,指数仍将设置为0 .基本上,python使用精度有限的数值方法,并且指数估计超出了它可以处理的值范围
我不确定你是如何拟合曲线的 - 你使用多项式最小二乘法吗?在这种情况下,你会期望适应性随着每一个额外的灵活性而提高,并且你选择基于边际改善/外部理论递减的力量 .
改善的合身应该看起来像this .
我实际上写了一些代码来在python中做一个类的多项式最小二乘一段时间,which you can find here on Github . 它's a bit hacky though and loosely commented since I was just using it to solve exercises. Hope it'很有帮助 .