如何将多项式拟合到带误差条的数据中

11 投票
3 回答
38635 浏览
提问于 2025-04-16 21:19

我现在正在使用numpy.polyfit(x,y,deg)来给实验数据拟合一个多项式。不过,我想要拟合一个可以根据数据点的误差来加权的多项式。

我发现了scipy.curve_fit这个工具,它可以使用权重。我想我可以把函数'f'设置成我想要的多项式形式,然后把我的权重放在'sigma'里,这样就能实现我的目标了。

我在想,是否还有其他更好的方法呢?

非常感谢。

3 个回答

-2

下面是我怎么做的,里面有很多注释!

注意:我用的是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()
16

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

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更通用和强大的优化工具(因为它们可以拟合几乎任何函数),但polyfit的好处在于它能提供一个(精确的)解析解,因此通常比像curve_fitleastsq这样的迭代近似方法要快得多,特别是在对多个y数据集(在同一个x向量下获得)进行多项式拟合时。

更新:从numpy 1.7版本开始,numpy.polyfit也可以接受权重作为输入(理想情况下应该用1/sigma,而不是1/variance

8

你可以看看这个链接 http://scipy-cookbook.readthedocs.io/items/FittingData.html,特别是里面关于 '用带误差的数据拟合幂律' 的那一部分。它展示了如何使用 scipy.optimize.leastsq 这个工具,配合一个包含误差加权的函数。

撰写回答