Подгонка кривой к краю диаграммы рассеяния - PullRequest
2 голосов
/ 24 июня 2019

Я борюсь с проблемой, которая включает вычисление уравнения кривой, подходящей для края диаграммы рассеяния, показанной ниже.Это четко очерченный край, но мне нужно точное соответствие.

Я основывал свои первые попытки на этом сценарии ...

Подогнать кривую к границе диаграммы рассеяния

... но я 'я недостаточно знаком с Python, чтобы знать, как этот код составлен, читая его, и не могу полностью адаптировать его к моей ситуации.

Вот что я попробовал из этого примера.Цель здесь состоит в том, чтобы смоделировать кривую как экспоненциальный рост с пределом, а затем итеративно сместить кривую вниз к точкам.Однако ни это, ни scipy.optimize curve_fit, кажется, не дают мне точной подгонки.

from math import e
model = lambda x, a, b: (a * (1 - (e ** (-b * x)))

def get_flipped(y_data, y_model):
    flipped = y_model - y_data
    flipped[flipped > 0] = 0
    return flipped

def flipped_resid(pars, x, y):
    y_model = model(x, *pars)
    flipped = get_flipped(y, y_model)
    resid = np.square(y + flipped - y_model)
    return np.nan_to_num(resid)

from scipy.optimize import leastsq
guesses =[100, 5]
fit_pars, flag = leastsq(func = flipped_resid, x0 = guesses,
                     args = (x_data, y_data))

Кривая должна соответствовать

Я относительно новичок в Python (R native), поэтому здесь могут быть некоторые очевидные ошибки, но как я могу улучшить подгонку так, чтобы линия находилась прямо на краю?

1 Ответ

0 голосов
/ 25 июня 2019

Я извлек точки данных по краю, и для их подгонки мне пришлось добавить смещение в ваше уравнение - сделать его "a * (1 - (exp (-b * X))) + смещение", которое дал хорошее прилегание к краю с параметрами a = 9,9214258118219334E + 01, b = 4,2835994748526849E + 00 и смещением = -1,4428475065933015E + 00. Возможно, это отсутствие смещения вызывает у вас трудности.

plot

...