簡體   English   中英

如何將多項式擬合到帶有誤差線的數據

[英]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_fitleastsqpolyfit更通用和更強大的優化工具(因為它們可以擬合任何函數),但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 一起使用。

這是我的做法,有很多評論!

注意:我用 qthnth 階多項式擬合來做到這一點。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM