[英]How to fit polynomial to data with error bars
我目前正在使用 numpy.polyfit(x,y,deg) 將多項式擬合到實驗數據。 但是,我想擬合一個使用基於點的誤差加權的多項式。
我發現scipy.curve_fit使用權重,我想我可以將 function 設置為“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
需要注意的是,在此 function 中,權重不應以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 與包含誤差加權的 function 一起使用。
這是我的做法,有很多評論!
注意:我用 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.