Как добавить перекос в StepModel - PullRequest
0 голосов
/ 07 января 2020

У меня есть модель, состоящая из суммы нескольких шагов lmfit StepModel (form = 'erf'), которая очень хорошо подходит для моих данных. Тем не менее, остаток показывает некоторый перекос на каждом шаге. Я могу использовать skew(output.result.residual), чтобы дать мне перекос по всему набору данных, но мне бы очень хотелось иметь значение перекоса для каждого компонента модели, то есть перекос 1, связанный с шагом 1, перекос 2 с шагом 2 и т. Д. c.

Я изменил код в examples / doc_builtinmodels_stepmodel.py, чтобы привести пример того, что я имею в виду:

import matplotlib.pyplot as plt
import numpy as np

from lmfit.models import LinearModel, StepModel

x = np.linspace(0, 10, 201)
a = np.ones_like(x)
b = np.ones_like(x)

a[:48] = 0.0
a[48:77] = np.arange(77-48)/(77.0-48)
b[:10] = 0.0
b[10:39] = np.arange(39-10)/(39.0-10)

np.random.seed(0)
a = 110.2 * (a + 9e-3*np.random.randn(x.size)) + 12.0 + 2.22*x
b = 110.2 * (b + 9e-3*np.random.randn(x.size)) + 12.0 + 2.22*x

y = a + b

step_mod = StepModel(form='erf', prefix='s1_')
step2_mod = StepModel(form='erf', prefix='s2_')
line_mod = LinearModel(prefix='line_')

pars = line_mod.make_params(intercept=y.min(), slope=0)
pars += step_mod.guess(y, x=x, center=2.5)
pars += step2_mod.guess(y, x=x, center=2.5)

mod = step_mod + step2_mod + line_mod
out = mod.fit(y, pars, x=x)

out.plot(data_kws={'markersize':  1})
print(skew(out.result.residual))

Я подозреваю, что мне, возможно, придется создавать перекос напрямую в функцию StepModel (), но я признаю, что не знаю, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...