我有一个数据集,理论上用二次多项式来描述我想拟合这些数据,我已经使用了numpy.polyfit
来实现这一点但是,缺点是返回系数上的错误不可用。因此,我决定也使用scipy.odr
来拟合数据奇怪的是多项式的系数互相偏离。
我不理解这一点,因此决定在我自己生成的一组数据上测试两个拟合例程:
import numpy
import scipy.odr
import matplotlib.pyplot as plt
x = numpy.arange(-20, 20, 0.1)
y = 1.8 * x**2 -2.1 * x + 0.6 + numpy.random.normal(scale = 100, size = len(x))
#Define function for scipy.odr
def fit_func(p, t):
return p[0] * t**2 + p[1] * t + p[2]
#Fit the data using numpy.polyfit
fit_np = numpy.polyfit(x, y, 2)
#Fit the data using scipy.odr
Model = scipy.odr.Model(fit_func)
Data = scipy.odr.RealData(x, y)
Odr = scipy.odr.ODR(Data, Model, [1.5, -2, 1], maxit = 10000)
output = Odr.run()
#output.pprint()
beta = output.beta
betastd = output.sd_beta
print "poly", fit_np
print "ODR", beta
plt.plot(x, y, "bo")
plt.plot(x, numpy.polyval(fit_np, x), "r--", lw = 2)
plt.plot(x, fit_func(beta, x), "g--", lw = 2)
plt.tight_layout()
plt.show()
结果示例如下:
poly [ 1.77992643 -2.42753714 3.86331152]
ODR [ 3.8161735 -23.08952492 -146.76214989]
在包含的图像中,
numpy.polyfit
(红色虚线)的解对应得很好。scipy.odr
(绿色虚线)的解决方案基本上完全关闭。我必须注意到numpy.polyfit
和scipy.odr
之间的差异在我想要拟合的实际数据集中比较小。然而,我不明白这两者的区别是从何而来,为什么在我自己的测试例子中,差异非常大,而哪种拟合程序更好?我希望你能提供一些答案,帮助我更好地理解这两个合适的程序,并在这个过程中提供我的问题的答案。
最佳答案
在使用odr的过程中,它会进行完全的正交距离回归。让它做一个正常的非线性最小二乘拟合
Odr.set_job(fit_type=2)
在开始优化之前,您将得到您所期望的结果。
完整ODR失败得如此严重的原因是没有指定权重/标准偏差。显然很难解释点云,假设x和y的wheights相等。如果你提供估计的标准差,odr也会产生一个好的结果(当然不同)。
Data = scipy.odr.RealData(x, y, sx=0.1, sy=10)
关于python - numpy.polyfit与scipy.odr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24804397/