python – numpy.polyfit与scipy.odr
发布时间:2020-12-20 11:36:28 所属栏目:Python 来源:网络整理
导读:我有一个理论上用二次多项式描述的数据集.我想适应这些数据,我使用numpy.polyfit来做到这一点.但是,缺点是返回系数的误差不可用.因此我决定使用scipy.odr来拟合数据.奇怪的是,多项式的系数彼此偏离. 我不明白这一点,因此决定在我生成自己的一组数据上测试两
我有一个理论上用二次多项式描述的数据集.我想适应这些数据,我使用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,"bo") plt.plot(x,numpy.polyval(fit_np,x),"r--",lw = 2) plt.plot(x,fit_func(beta,"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的平等轮数.如果您提供估计的标准偏差,odr也会产生良好的(当然不同的)结果. Data = scipy.odr.RealData(x,sx=0.1,sy=10) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |