Как включить полосы ошибок в lmfit при подгонке данных к профилю Гаусса? - PullRequest
0 голосов
/ 02 июня 2019

Я использую lmfit для подгонки моих данных к гауссианам.Есть три вещи, которые я пытаюсь применить: 1) Понять, как ошибки рассчитываются в lmfit 2) Как включить мои собственные вычисленные ошибки в lmfit 3) Как отобразить ошибки в пределах соответствия

def gaussian(x, amp, cen, fwhm):
    return + amp * np.exp(-(x - cen) ** 2 / (2 * (fwhm / 2.35482) ** 2))    

def gaussian_fit(x,y,guess=[1,0,0,5],varies=[True,True,True,True]):

c = 299792458 #m/s
gmod = Model(gaussian)
gmod.nan_policy = 'omit'
#x,y - your dataset to fit, with x and y values
print (np.max(y))
gmod.set_param_hint('amp', value=guess[0],vary=varies[0])  
gmod.set_param_hint('cen', value=guess[1],vary=varies[1])
gmod.set_param_hint('fwhm', value=guess[2],vary=varies[2])  
gmod.make_params()

result = gmod.fit(y,x=x,amp=guess[0], cen=guess[1], fwhm=guess[2])

amp = result.best_values['amp']
cen = result.best_values['cen']
fwhm = result.best_values['fwhm']
#level = result.best_values['level']
sigma = fwhm / 2.35482
c = 299792458 #m/s
print(result.fit_report())

gaussfield = amp * np.sqrt(2 * np.pi * sigma ** 2)
residual = y - result.best_fit

print ('params:',amp,cen,fwhm,sigma,gaussfield)
return amp,cen,fwhm,sigma,gaussfield,residual

amp, cen, fwhm, sigma, gaussfield, residual 
= gaussian_fit(xdata,ydata,guess=[.1,6.9,.02],varies=[True,False,False]) 

Я не вижу, где ошибки включены в сценарий, так как они были включены в окончательный отчет?Как вы можете включить свои собственные ошибки вместо ошибок из lmfit, и как вы можете, наконец, отобразить эти ошибки?

1 Ответ

1 голос
/ 03 июня 2019

Во-первых, я бы порекомендовал просто использовать lmfit.models.GaussianModel, а не set_param_hint() - просто быть явным, не умным - как с:

from lmfit.models import GaussianModel
gmodel = GaussianModel()
params = gmodel.make_params(amplitude=1, center=0, sigma=2)
result = gmodel.fit(y, params, x=x)

print(result.fit_report())

Теперь на ваши вопросы:

  1. Неопределенности в параметрах наилучшего соответствия оцениваются путем рассмотрения того, как изменение значений параметров может изменить соответствие.С chi-square, определенным как сумма квадратов остаточного массива (data-fit)/data_uncertainty, неопределенности для каждого параметра (и корреляции параметра-параметра) оцениваются как значения, которые увеличивают chi-square на 1. Есть еще много углубленныхресурсы, доступные для работы нелинейного подбора наименьших квадратов.

  2. "Как включить мои собственные вычисленные ошибки в lmfit".Здесь я бы предположил, что вы имеете в виду неопределенности в данных y , а не неопределенности в параметрах (например, как вы узнали бы неопределенности, но не значения?).Если у вас есть неопределенности в ваших данных, передайте их как массив weights в Model.fit, возможно, как

    result = gmodel.fit (y, params, x = x, weights = 1.0 / dely)

  3. Как отобразить ошибки в подгонке.Вы можете отобразить данные и их панели ошибок с помощью функции matplotlibs errorbar.Если вы хотите отобразить влияние неопределенностей в параметрах на ожидаемый диапазон кривой наилучшего соответствия, вы можете использовать delmodel = result.eval_uncertainty(x=x), а затем построить x против result.best_fit + delmodel и result.best_fit - delmodel.Функция Matplotlib fill_between часто полезна для этого.

...