Python 带曲线拟合的指数拟合不';工作不好
我必须计算指数回归曲线,所以按照web上的指示,我编写了这段代码。 问题是,对于某些数据集,我从指数回归中得到的结果与wolfram上得到的结果非常接近(因此我假设它是正确的)。对于其他数据集,我的解决方案完全是胡说八道,例如r^2等于1.35E125,打印“y预测值”,我意识到如果这些值都高得离谱,回归就不会正确发生 通过从中进行指数回归,我得到了值r^2的值接近于我通过其他类型的回归得到的值,所以我假设这个站点返回给我的解决方案是正确的 为什么我的工作不正常 这是我的密码: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
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))
。这是不幸的,但却是必要的,因为如果指数太大,它往往占主导地位,如果指数太小,它就会完全消失。有关更多讨论,请参阅。