Как исключить значения из полиномиального соответствия? - PullRequest
0 голосов
/ 13 ноября 2018

Я подгоняю полином к моим данным, как показано на рисунке: enter image description here

Использование скрипта:

from scipy.optimize import curve_fit
import scipy.stats
from scipy import asarray as ar,exp

xdata = xvalues
ydata = yvalues

fittedParameters = numpy.polyfit(xdata, ydata + .00001005 , 3)
modelPredictions = numpy.polyval(fittedParameters, xdata) 

axes.plot(xdata, ydata,  '-')
xModel = numpy.linspace(min(xdata), max(xdata))
yModel = numpy.polyval(fittedParameters, xModel)

axes.plot(xModel, yModel)

Я хочу исключить регион от 3,4 до 3,55 мкм. Как я могу сделать это в моем сценарии? Также у меня есть NaNs, от которых я пытаюсь избавиться в оригинальном файле .fits. Помощь будет оценена.

1 Ответ

0 голосов
/ 13 ноября 2018

Вы можете замаскировать значения в вашем регионе исключения и позже применить эту маску к своей функции подгонки

# Using random data here, since you haven't provided sample data
xdata = numpy.arange(3,4,0.01)
ydata = 2* numpy.random.rand(len(xdata)) + xdata

# Create mask (boolean array) of values outside of your exclusion region
mask = (xdata < 3.4) | (xdata > 3.55)

# Do the fit on all data (for comparison)
fittedParameters = numpy.polyfit(xdata, ydata + .00001005 , 3)
modelPredictions = numpy.polyval(fittedParameters, xdata) 
xModel = numpy.linspace(min(xdata), max(xdata))
yModel = numpy.polyval(fittedParameters, xModel)

# Do the fit on the masked data (i.e. only that data, where mask == True)
fittedParameters1 = numpy.polyfit(xdata[mask], ydata[mask] + .00001005 , 3)
modelPredictions1 = numpy.polyval(fittedParameters1, xdata[mask]) 
xModel1 = numpy.linspace(min(xdata[mask]), max(xdata[mask]))
yModel1 = numpy.polyval(fittedParameters1, xModel1)

# Plot stuff
axes.plot(xdata, ydata,  '-')
axes.plot(xModel, yModel)        # orange
axes.plot(xModel1, yModel1)      # green

дает

enter image description here

Зеленая кривая теперь подходит, за исключением 3.4 < xdata 3.55. Оранжевая кривая - примерка без исключения (для сравнения)

Если вы хотите исключить также возможные nans в вашем xdata, вы можете улучшить mask с помощью функции numpy.isnan(), например

# Create mask (boolean array) of values outside of your exclusion AND which ar not nan
xdata < 3.4) | (xdata > 3.55) & ~numpy.isnan(xdata)
...