我目前正在使用 numpy.polyfit(x,y,deg) 将多项式拟合到实验数据。但是,我想拟合一个使用基于点的误差加权的多项式。
我找到了使用权重的scipy.curve_fit,我想我可以将函数“f”设置为我想要的顺序的多项式,并将我的权重放在“sigma”中,这应该可以实现我的目标。
我想知道还有另一种更好的方法吗?
非常感谢。
我目前正在使用 numpy.polyfit(x,y,deg) 将多项式拟合到实验数据。但是,我想拟合一个使用基于点的误差加权的多项式。
我找到了使用权重的scipy.curve_fit,我想我可以将函数“f”设置为我想要的顺序的多项式,并将我的权重放在“sigma”中,这应该可以实现我的目标。
我想知道还有另一种更好的方法吗?
非常感谢。
对于加权多项式拟合,您可以使用:
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
andleastsq
是比polyfit
(因为它们可以拟合任何函数)更通用和更强大的优化工具,polyfit
但它的优势在于它产生(精确)解析解,因此可能比迭代逼近方法(如curve_fit
and )快得多leastsq
- 特别是在将多项式拟合到多组 y 数据的情况(在相同的 x 向量处获得)
更新:从 numpy 1.7 版开始,numpy.polyfit
也将权重作为输入(理想情况下应该提供为1/sigma
,而不是1/variance
)
看看http://scipy-cookbook.readthedocs.io/items/FittingData.html特别是“将幂律拟合到有错误的数据”部分。它展示了如何将 scipy.optimize.leastsq 与包含误差加权的函数一起使用。
这是我的做法,有很多评论!
注意:我用 qth和nth 阶多项式拟合来做到这一点。
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()