如何将多项式拟合到带误差条的数据中
我现在正在使用numpy.polyfit(x,y,deg)来给实验数据拟合一个多项式。不过,我想要拟合一个可以根据数据点的误差来加权的多项式。
我发现了scipy.curve_fit这个工具,它可以使用权重。我想我可以把函数'f'设置成我想要的多项式形式,然后把我的权重放在'sigma'里,这样就能实现我的目标了。
我在想,是否还有其他更好的方法呢?
非常感谢。
3 个回答
下面是我怎么做的,里面有很多注释!
注意:我用的是q次和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()
对于加权多项式拟合,你可以使用:
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_fit
和leastsq
是比polyfit
更通用和强大的优化工具(因为它们可以拟合几乎任何函数),但polyfit
的好处在于它能提供一个(精确的)解析解,因此通常比像curve_fit
和leastsq
这样的迭代近似方法要快得多,特别是在对多个y数据集(在同一个x向量下获得)进行多项式拟合时。
更新:从numpy 1.7版本开始,numpy.polyfit
也可以接受权重作为输入(理想情况下应该用1/sigma
,而不是1/variance
)
你可以看看这个链接 http://scipy-cookbook.readthedocs.io/items/FittingData.html,特别是里面关于 '用带误差的数据拟合幂律' 的那一部分。它展示了如何使用 scipy.optimize.leastsq 这个工具,配合一个包含误差加权的函数。