Python 带曲线拟合的指数拟合不';工作不好

Python 带曲线拟合的指数拟合不';工作不好,python,scipy,regression,exponential,non-linear-regression,Python,Scipy,Regression,Exponential,Non Linear Regression,我必须计算指数回归曲线,所以按照web上的指示,我编写了这段代码。 问题是,对于某些数据集,我从指数回归中得到的结果与wolfram上得到的结果非常接近(因此我假设它是正确的)。对于其他数据集,我的解决方案完全是胡说八道,例如r^2等于1.35E125,打印“y预测值”,我意识到​​如果这些值都高得离谱,回归就不会正确发生 通过从中进行指数回归,我得到了值​​r^2的值接近于我通过其他类型的回归得到的值,所以我假设这个站点返回给我的解决方案是正确的 为什么我的工作不正常 这是我的密码: def

我必须计算指数回归曲线,所以按照web上的指示,我编写了这段代码。 问题是,对于某些数据集,我从指数回归中得到的结果与wolfram上得到的结果非常接近(因此我假设它是正确的)。对于其他数据集,我的解决方案完全是胡说八道,例如r^2等于1.35E125,打印“y预测值”,我意识到​​如果这些值都高得离谱,回归就不会正确发生

通过从中进行指数回归,我得到了值​​r^2的值接近于我通过其他类型的回归得到的值,所以我假设这个站点返回给我的解决方案是正确的

为什么我的工作不正常

这是我的密码:

def func_exp(x, a ,b, c):
    return a * numpy.exp(b * x)

def compute(dataset, type):
    x = dataframe.iloc[:,0].values
    y = dataframe.iloc[:,1].values
    result = {}
    ...
    elif type=="exponential":
        popt, pcov = curve_fit(func_exp, x, y)
        print(popt)   
        #already here the coefficients I get I think are wrong, I get:
        # a = 6.46670314e-18 ; b = 9.99999998e-01 ; c = 1.00000000e+00
        #but on the site I entered above I get a = 9.365021685; b=1.049973813*10^(-2)
        coeff = []
        coeff.append(round(float(popt[0]),4))
        coeff.append(round(float(popt[1]),4))
        result["coeff"] = coeff
        yhat = func_exp(x, *popt)  # or [p(z) for z in x]
        ybar = numpy.sum(y) / len(y)  # or sum(y)/len(y)
        ssreg = numpy.sum((yhat - ybar) ** 2)  # or sum([ (yihat - ybar)**2 for yihat in yhat])
        sstot = numpy.sum((y - ybar) ** 2)  # or sum([ (yi - ybar)**2 for yi in y])

        minX = numpy.ndarray.min(x)
        maxX = numpy.ndarray.max(x)
        print(maxX)
        #if len(x) is low the regression curve is a set of segments, so i introduce varX
        varX = numpy.linspace(start=minX, stop=maxX, num=max(100, numpy.size(x)))
        print(x)
        plt.plot(x, y, 'o')
        xName = columnsName[0]
        yName = columnsName[1]
        plt.xlabel(xName)
        plt.ylabel(yName)
        for i in range(0, len(varX)):
            print(varX[i], func_exp(varX, *popt)[i])     #print for y predicted
        plt.plot(varX, func_exp(varX, *popt), label="fit: {:.3f}, {:.3f}, {:.3f}".format(*popt))
        plt.show()
        result['r2'] = float(ssreg / sstot)

我上传了我在github页面上使用的数据集,这是,正如您所看到的,这是我在web上找到的一个简单的身高体重csv。

您必须为曲线拟合提供合理的初始条件才能获得良好的结果。例如,
popt,pcov=曲线拟合(func\u exp,x,y,(1,0.1))
。这是不幸的,但却是必要的,因为如果指数太大,它往往占主导地位,如果指数太小,它就会完全消失。有关更多讨论,请参阅。