如何使用误差线将多项式拟合到数据

时间:2011-07-12 10:58:36

标签: python numpy scipy curve-fitting

我目前正在使用numpy.polyfit(x,y,deg)来将多项式拟合到实验数据。然而,我想拟合一个基于点的误差使用加权的多项式。

我发现scipy.curve_fit使用了权重,我想我可以将函数'f'设置为我所需顺序的多项式,并将我的权重放在'sigma'中,应该实现我的目标。

我想知道还有另一个更好的方法吗?

非常感谢。

3 个答案:

答案 0 :(得分:15)

对于加权多项式拟合,您可以使用:

numpy.polynomial.polynomial.polyfit(x, y, deg, rcond=None, full=False, w=weights)

请参阅http://docs.scipy.org/doc/numpy/reference/generated/numpy.polynomial.polynomial.polyfit.html

重要的是要注意,在此功能中,权重应 作为1/variance提供(这是许多加权应用程序中的常用形式),但是1/sigma

虽然curve_fitleastsq是比polyfit更通用且功能更强大的优化工具(因为它们只适合任何函数),{{1它具有产生(精确)解析解的优点,因此可能比polyfitcurve_fit等迭代近似方法快得多 - 特别是在将多项式拟合到多组y-的情况下数据(在相同的x向量下获得)

更新: 从numpy版本1.7开始,leastsq也将权重作为输入(理想情况下应将其作为numpy.polyfit提供,而不是1/sigma

答案 1 :(得分:7)

请查看http://scipy-cookbook.readthedocs.io/items/FittingData.html,尤其是'Fitting a power-law to data with errors'部分。它显示了如何将scipy.optimize.leastsq与包含错误权重的函数一起使用。

答案 2 :(得分:-2)

我是这样做的,有很多评论!

注意:我用qth n阶多项式拟合来做。

from numpy import *
import pylab

# get data
fn = 'cooltemp.dat'
x, y, xerr, yerr = loadtxt(fn,unpack=True, usecols=[0,1,2,3])

# create nth degree polynomial fit
n = 1
zn = polyfit(x,y,n) 
pn = poly1d(zn) # construct polynomial 

# create qth degree polynomial fit
q = 5
zq = polyfit(x,y,q) 
pq = poly1d(zq)

# plot data and fit
xx = linspace(0, max(x), 500)
pylab.plot(xx, pn(xx),'-g', xx, pq(xx),'-b')
pylab.errorbar(x, y, xerr, yerr, fmt='r.')

# customise graph
pylab.legend(['degree '+str(n),'degree '+str(q),'data'])
pylab.axis([0,max(x),0,max(y)])
pylab.xlabel('x label (unit)')
pylab.ylabel('y label (unit)')

pylab.show()