Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python曲线拟合模型_Python - Fatal编程技术网

Python曲线拟合模型

Python曲线拟合模型,python,Python,我正在尝试使用Python将曲线拟合到一系列数据点,总结如下: 从下面可以看出,大于2阶的多项式似乎是最适合的,其次是线性多项式,最后是指数多项式,总体结果最差 虽然我知道这可能不是指数增长,但我只是想知道你是否会认为指数函数的性能如此糟糕(基本上,x,b的系数被设置为0,并且曲线上的任意点被选为相交点),或者我是否在代码中做了一些错误的事情来拟合 我使用的代码如下所示: # Fitting def exponenial_func(x,a,b,c): return a*np.exp(-

我正在尝试使用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')
*编辑:曲线拟合从scipy.optimize包导入

from scipy.optimize import curve_fit

如果你对诸如指数这样的函数的初始猜测很差,那么曲线拟合的性能往往很差,最终可能会得到非常大的数字。您可以尝试更改maxfev输入,以便它运行更多的迭代。否则,我建议尝试以下方法:

p0=(1000,-.005,0)
-.01,因为它从300倍增加到500倍,等式中有-b,100 0,因为它在300倍时是3000倍(0的1.5倍)。看看结果如何

至于为什么初始指数根本不起作用,您的初始猜测是b=1,x在
(3001000)
或范围内。这意味着python正在计算
exp(-300)
,它要么抛出异常,要么设置为0。在这一点上,无论b是增加还是减少,对于初始估计值附近的任何值,指数仍将设置为0


基本上,python使用的是一种精度有限的数值方法,指数估计超出了它可以处理的值范围

曲线拟合往往表现不佳,如果你对诸如指数之类的函数的初始猜测很差,最终可能会得到非常大的数。您可以尝试更改maxfev输入,以便它运行更多的迭代。否则,我建议尝试以下方法:

p0=(1000,-.005,0)
-.01,因为它从300倍增加到500倍,等式中有-b,100 0,因为它在300倍时是3000倍(0的1.5倍)。看看结果如何

至于为什么初始指数根本不起作用,您的初始猜测是b=1,x在
(3001000)
或范围内。这意味着python正在计算
exp(-300)
,它要么抛出异常,要么设置为0。在这一点上,无论b是增加还是减少,对于初始估计值附近的任何值,指数仍将设置为0


基本上,python使用的是精度有限的数值方法,而指数估计超出了它可以处理的值的范围

我不确定如何拟合曲线——是否使用多项式最小二乘法?在这种情况下,你会期望每增加一个灵活度,拟合度就会提高,你会根据边际改进递减/外部理论来选择功率

改善的合身度应该是这样的


实际上,我写了一些代码在python中为类a编写多项式最小二乘法。这是一个有点黑客虽然和松散的评论,因为我只是用它来解决练习。希望对您有所帮助。

我不确定您是如何拟合曲线的——您使用的是多项式最小二乘法吗?在这种情况下,你会期望每增加一个灵活度,拟合度就会提高,你会根据边际改进递减/外部理论来选择功率

改善的合身度应该是这样的


实际上,我写了一些代码在python中为类a编写多项式最小二乘法。这是一个有点黑客虽然和松散的评论,因为我只是用它来解决练习。希望有帮助。

x
接近正无穷大时,你的指数函数接近零。换句话说,它看起来更像是
1/x
,而不是
x
。如果你对曲线拟合的初始猜测很差,那么它的性能往往会很差,比如指数函数,最终可能会得到非常大的数。您可以尝试更改maxfev输入,以便它运行更多的迭代。否则,我建议尝试使用p0=(1000,-.005,0)-.01这样的值,因为它从300倍增加到500倍,你的方程中有-b,100 0,因为它在300倍时是3000倍(从0加倍1.5倍)。看看结果如何out@DavidL是的,事实上就是这样,如果你把你的答案作为实际答案加起来,我会接受:)你的指数函数接近零,因为
x
接近正无穷大。换句话说,它看起来更像是
1/x
,而不是
x
。如果你对曲线拟合的初始猜测很差,那么它的性能往往会很差,比如指数函数,最终可能会得到非常大的数。您可以尝试更改maxfev输入,以便它运行更多的迭代。否则,我建议尝试使用p0=(1000,-.005,0)-.01这样的值,因为它从300倍增加到500倍,你的方程中有-b,100 0,因为它在300倍时是3000倍(从0加倍1.5倍)。看看结果如何out@DavidL是的,事实上就是这样,如果你把你的答案作为实际答案加起来,我会接受:)