Как подогнать полином к данным с ошибками - PullRequest
9 голосов
/ 12 июля 2011

В настоящее время я использую numpy.polyfit (x, y, deg) для подгонки полинома к экспериментальным данным.Однако я хотел бы подогнать полином, который использует взвешивание на основе ошибок точек.

Я нашел scipy.curve_fit , который использует веса, и я полагаю, что я мог бы просто установитьФункция 'F', чтобы сформировать многочлен моего желаемого порядка, и положить мои веса в «Сигма», что должно достичь моей цели.

Мне было интересно, есть ли другой, лучший способ сделать это?

Большое спасибо.

Ответы [ 3 ]

15 голосов
/ 03 октября 2012

Для взвешенной полиномиальной подгонки вы можете использовать:

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 (в том смысле, что они могут соответствовать только любой функции), polyfit обладает тем преимуществом, что дает (точное) аналитическое решение и поэтому, вероятно, намного быстрее, чем методы итерационной аппроксимации, такие как curve_fit и leastsq - особенно в случае подгонки многочленов к нескольким наборам y-данных (полученных по одному и тому же x-вектору)

Обновление: Начиная с версии numpy1.7, numpy.polyfit также принимает веса в качестве входных данных (которые в идеале должны быть представлены как 1/sigma, а не 1/variance)

7 голосов
/ 12 июля 2011

Взгляните на http://scipy -cookbook.readthedocs.io / items / FittingData.html , в частности, на раздел «Подгонка степенного закона к данным с ошибками» . В нем показано, как использовать scipy.optimize.leastsq с функцией, включающей взвешивание ошибок.

0 голосов
/ 16 августа 2012

Вот как я это сделал, с большим количеством комментариев!

Примечание. Я сделал это с полиномами 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()
...