Python и lmfit: как построить несколько подгонок, полученных остатками функции минимизации

Я хочу сделать глобальную подгонку двух наборов данных и построить результаты. Я нашел ответ на вопрос «Python и lmfit: как сопоставить несколько наборов данных с общими параметрами?» ответил @M Newville. Модифицированный код:

params =  Parameters()
params.add('center_1',    5.0, vary=True)
params.add('amplitude_1', 10.0, vary=True)
params.add('sigma_1',    1.0, vary=True)

params.add('center_2',    8.0, vary=True)
params.add('amplitude_2', 3.0, vary=True)
params.add('sigma_2',    2.0, vary=True)

x = linspace(-10, 10, 101)
data1 = gaussian(x, 5.33, 3.21, 1.51) + random.normal(0, 0.2, x.size)
data2 = gaussian(x, 3.1, 1.21, 1.51) + random.normal(0, 0.2, x.size)
datasets = [data1, data2]
def residual(params, x, datasets):
    model1 = gaussian(x, params['amplitude_1'], params['center_1'], params['sigma_1'])
    model2 = gaussian(x, params['amplitude_2'], params['center_2'], params['sigma_2'])

    resid1 = datasets[0] - model1
    resid2 = datasets[1] - model2
    return np.concatenate((resid1, resid2))

fit = minimize(residual, params, args=(x,), kws={'datasets': datasets})
print(fit_report(fit))

Итак, моя проблема в том, что я хочу представить данные и результаты подгонки на графике, но я не знаю, как это сделать? Пожалуйста, кто-нибудь может дать мне ключ?

Редактировать:

Мой новый код будет:

params =  Parameters()
params.add('cen',    5.0, vary=True)
params.add('amp', 10.0, vary=True)
params.add('sig',    1.0, vary=True)

params.add('pen',    8.0, vary=True)
params.add('inter', 3.0, vary=True)

def reta(x, a, c):
        return a * x + c

x = linspace(-10, 10, 101)
data1 = gaussian(x, 5.33, 3.21, 1.51) + random.normal(0, 0.2, x.size)
data2 = reta(x, 3.1, 1) + random.normal(0, 0.2, x.size)
datasets = [data1, data2]
def residual(params, x, datasets):
    model1 = gaussian(x, params['amp'], params['cen'], params['sig'])
    model2 = reta(x, params['pen'], params['inter'])

    resid1 = datasets[0] - model1
    resid2 = datasets[1] - model2
    return np.concatenate((resid1, resid2))

fit = minimize(residual, params, args=(x,), kws={'datasets': datasets})
print(fit_report(fit))

plt.figure()
plt.plot(x, data1)
plt.plot(x, data2)

Если бы у меня была только одна функция, я мог бы сделать это:

plt.plot(x, residual(fit.params) + data1, 'r', label='best fit')

Но для двух моделей у меня проблемы.


person Charlie Vargas Sarmiento    schedule 02.04.2020    source источник
comment
Пример на stackoverflow.com/questions/20339234 включает графическое изображение результатов. Если этого недостаточно, уточните вопрос и покажите, что вы пробовали, но это не то, что вы ищете.   -  person M Newville    schedule 02.04.2020
comment
Моя проблема в том, что я не знаю, как заменить результаты подгонки в функциях, чтобы построить график. В своем ответе вы создаете функцию gauss_dataset для замены результатов. Я мог бы использовать его, но я хочу иметь две разные модели... поэтому я хочу знать, как заменить мои результаты примерки. Я буду редактировать свои модели в коде.   -  person Charlie Vargas Sarmiento    schedule 02.04.2020
comment
Ну да, наличие метода расчета модели для каждого набора данных сделало бы это намного проще, не так ли? Затем вы просто вызовете этот метод с вашим fit.params. В противном случае вам придется делать это вручную...   -  person M Newville    schedule 02.04.2020
comment
Да, но проблема будет, если функции имеют общие параметры. Подскажите пожалуйста, как я могу заменить результаты примерки в моем случае? Нужно ли менять модели, чтобы показать проблему?   -  person Charlie Vargas Sarmiento    schedule 02.04.2020
comment
напишите функцию, которая принимает текущие параметры и вычисляет модели для двух наборов данных. Затем измените свою функцию остатка, чтобы вызвать эту функцию, и используйте результаты для создания остатка.   -  person M Newville    schedule 03.04.2020