[英]Problems with curve_fit from scipy.optimze
我知道有一些类似的问题,但由于他们都没有带我进一步,我决定问一个我自己的问题。 对不起,如果我的问题的答案已经在某处,但我真的找不到它。
我尝试使用curve_fit将f(x)= a * x ** b拟合为相当线性的数据。 它编译正确,但结果如下所示:
问题是,我真的不知道我在做什么,但另一方面,拟合总是更像是一门艺术,而不是科学,至少有一个与scipy.optimize的一般错误 。
我的数据如下:
x值:
[16.8, 2.97, 0.157, 0.0394, 14.000000000000002, 8.03, 0.378, 0.192, 0.0428, 0.029799999999999997, 0.000781, 0.0007890000000000001]
y值:
[14561.766666666666, 7154.7950000000001, 661.53750000000002, 104.51446666666668, 40307.949999999997, 15993.933333333332, 1798.1166666666666, 1015.0476666666667, 194.93800000000002, 136.82833333333332, 9.9531566666666684, 12.073133333333333]
这是我的代码(在该问题的最后一个答案中使用了一个非常好的例子):
def func(x,p0,p1): # HERE WE DEFINE A FUNCTION THAT WE THINK WILL FOLLOW THE DATA DISTRIBUTION
return p0*(x**p1)
# Here you give the initial parameters for p0 which Python then iterates over to find the best fit
popt, pcov = curve_fit(func,xvalues,yvalues, p0=(1.0,1.0))#p0=(3107,0.944)) #THESE PARAMETERS ARE USER DEFINED
print(popt) # This contains your two best fit parameters
# Performing sum of squares
p0 = popt[0]
p1 = popt[1]
residuals = yvalues - func(xvalues,p0,p1)
fres = sum(residuals**2)
print 'chi-square'
print(fres) #THIS IS YOUR CHI-SQUARE VALUE!
xaxis = np.linspace(5e-4,20) # we can plot with xdata, but fit will not look good
curve_y = func(xaxis,p0,p1)
起始值来自与gnuplot的拟合,这似乎是合理的,但我需要交叉检查。
这是打印输出(首先适合p0,p1,然后是卡方):
[ 4.67885857e+03 6.24149549e-01]
chi-square
424707043.407
我想这是一个很难的问题,所以非常感谢!
当拟合curve_fit
优化(数据 - 模型)^ 2 /(误差)^ 2的总和时
如果您没有传递错误(正如您在此处所做的那样), curve_fit
假定所有点的错误均为1。
在这种情况下,当您的数据跨越多个数量级时,具有最大y值的点主导目标函数,并导致curve_fit
尝试以牺牲其他值为代价来拟合它们。
修复此问题的最佳方法是在拟合中包含yvalues
的误差(看起来就像你在你绘制的图中有误差条一样!)。 您可以通过将它们作为curve_fit
的sigma
参数传递来完成此curve_fit
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.