Как нарисовать образцы из модели lmfit?

У меня есть искаженная гауссовская модель в lmfit, которая соответствует моим данным. Теперь я хотел бы взять образец из него, но я нигде в документации не нашел как? Является ли правильный подход к простой реализации функции модели в моем случае искаженным нормальным распределением или для этого есть функция в lmfit?

Мой код:

model = SkewedGaussianModel()

params = model.make_params(amplitude=60, center=30, sigma=10, gamma=0)

result = model.fit(y, params, x=x)
print(result.fit_report())
plt.plot(x, result.best_fit)
plt.show()
# something like this
print(result.model.eval(random.random())

2 ответа

Решение

Определение искаженного гауссова, используемого в lmfit, дано по адресу http://lmfit.github.io/lmfit-py/builtin_models.html с кодом по адресу https://github.com/lmfit/lmfit-py/blob/master/lmfit/lineshapes.py.

Я считаю, что то, что вы ищете, это "выборка обратного преобразования". См. http://www.nehalemlabs.net/prototype/blog/2013/12/16/how-to-do-inverse-transformation-sampling-in-scipy-and-numpy/ чтобы узнать, как это сделать. Для этого в lmfit нет встроенного метода, поскольку lmfit не обязательно утверждает, что подгоняемая модель является функцией распределения вероятностей. Возможно, стоит подумать о добавлении такой возможности.

Пока кто-то не сможет найти функцию или подтвердить ее отсутствие, вот как я это сделал:

def pdf(x):
    return 1/sqrt(2*pi) * exp(-x**2/2)

def cdf(x):
    return (1 + erf(x/sqrt(2))) / 2

def skew(x,e=0,w=1,a=0):
    t = (x-e) / w
    return 2 / w * pdf(t) * cdf(a*t)
    # You can of course use the scipy.stats.norm versions
    # return 2 * norm.pdf(t) * norm.cdf(a*t)

скопировано из этого ответа

Другие вопросы по тегам