我目前正在使用numpy.polyfit(x,y,deg)来将多项式拟合到实验数据。然而,我想拟合一个基于点的误差使用加权的多项式。
我发现scipy.curve_fit使用了权重,我想我可以将函数'f'设置为我所需顺序的多项式,并将我的权重放在'sigma'中,应该实现我的目标。
我想知道还有另一个更好的方法吗?
非常感谢。
答案 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_fit
和leastsq
是比polyfit
更通用且功能更强大的优化工具(因为它们只适合任何函数),{{1它具有产生(精确)解析解的优点,因此可能比polyfit
和curve_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()