如何用误差条拟合多项式

2024-05-14 18:13:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我发现scipy.curve_fit利用了权重,我想我可以把函数“f”设置成我想要的阶数的多项式,然后把我的权重放在“sigma”中,这样就能达到我的目标。

我想知道还有其他更好的方法吗?

非常感谢。


Tags: 数据方法函数numpy利用目标scipysigma
3条回答

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

注意:我是用qthn阶多项式拟合的。

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()

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

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

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

相关问题 更多 >

    热门问题