Двойная посадка по Гауссу с общим центроидом Python - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь согласовать некоторые данные с двойной функцией Гаусса, используя scipy.optimization.curve_fit:

Двойное гауссовское соответствие с двумя центроидами

def _2gaussian(x, amp1, cen1, sigma1, amp2, cen2, sigma2):
    g1 = amp1 * (1 / (sigma1 * (np.sqrt(2 * np.pi)))) * (np.exp((-1.0 / 2.0) * (((x - cen1) / sigma1) ** 2)))
    g2 = amp2 * (1 / (sigma2 * (np.sqrt(2 * np.pi)))) * (np.exp((-1.0 / 2.0) * (((x - cen2) / sigma2) ** 2)))
    return g1 + g2  # + cen2

Так что моя проблема это: мои данные довольно симметричны, и я пытался использовать двойное гауссовское соответствие с общим / общим центроидом для двух гауссовских функций. Я попытался написать в предыдущей формуле cen1 вместо cen2 (и сохранить cen2 в параметрах) или также просто полностью исключить cen2 в качестве параметра. Ничего из этого не сработало, так что полученная посадка представляет собой просто плоскую кривую с большим шипом в середине Есть ли у вас какие-либо предложения о том, как иметь только общий центроид?

Двойной гауссиан только с cen1

1 Ответ

0 голосов
/ 21 апреля 2020

Самые низкие точки в ваших данных начинаются примерно с y = 4000. Но ваша функция Гаусса не имеет члена смещения, поэтому она всегда будет начинаться с y = 0. Вам нужно либо нормализовать ваши данные, либо добавить смещение следующим образом:

def _2gaussian(x, amp1, cen1, sigma1, amp2, cen2, sigma2, offset):
    g1 = amp1 * (1 / (sigma1 * (np.sqrt(2 * np.pi)))) * (np.exp((-1.0 / 2.0) * (((x - cen1) / sigma1) ** 2)))
    g2 = amp2 * (1 / (sigma2 * (np.sqrt(2 * np.pi)))) * (np.exp((-1.0 / 2.0) * (((x - cen2) / sigma2) ** 2)))
    return g1 + g2  + offset # + cen2

Тогда я настоятельно рекомендую использовать аргумент p0 в curve_fit, который позволит вам указать начальное предположение для каждого параметра в вашей функции подбора. В вашем случае ваше предположение для offset будет 4000.

...