scipy.curve_fit не подходит, если показатель степени опыта сам имеет показатель степени (постоянная) - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь подогнать эту кривую:

def logistic2_model(x, a, b, dtau, tau):
    return a/(1+b*np.exp(-np.power((x-dtau)/tau, 0.9)))

с использованием curve_fit

x = [54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L, 93L, 94L, 95L, 96L, 97L, 98L, 99L]
y = [229.0, 322.0, 400.0, 650.0, 888.0, 1128.0, 1694.0, 2036.0, 2502.0, 3089.0, 3858.0, 4636.0, 5883.0, 7375.0, 9172.0, 10149.0, 12462.0, 15113.0, 17660.0, 21157.0, 24747.0, 27980.0, 31506.0, 35713.0, 41035.0, 47021.0, 53578.0, 59138.0, 63927.0, 69176.0, 74386.0, 80539.0, 86498.0, 92472.0, 97689.0, 101739.0, 105792.0, 110574.0, 115242.0, 119827.0, 124632.0, 128948.0, 132547.0, 135586.0, 139422.0, 143626.0]

p0 = [1.52646450e+05, 1.56215676e-01, 9.59401246e+01, 6.23161909e+00]
fit = curve_fit(logistic2_model, x, y, maxfev=100000, p0=p0)

Это работает только если я использую 1.0. Если я использую любой другой поплавок, даже близко, он просто достигает maxfev безуспешно. С 2.0 это работает в принципе, но подгонка кривой не имеет никакого смысла.

p0 - это подгонка, полученная с этим показателем, равным 1.0: enter image description here

Моя первоначальная цель состояла в том, чтобы добавить этот показатель к параметрам, чтобы он подходил, но если он не сработает, даже без этого, нет надежды.

Любой намек?

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Пожалуйста, добавьте полный код, вкл. зарисовки.

Для тестирования, пожалуйста, используйте конвергентное решение для 1,0 и добавьте точки, скажем, 0,95 и 1,05 к графику. Это должно дать нам и вам представление о том, насколько чувствительно ваше уравнение к этому параметру. Может быть, уравнение сводит с ума дерьмо.

Для отправленного вами решения (0,9) возвращаемая ковариационная матрица имеет вид np.inf.

В этом документе указано:

Если матрица Якобиана в решение не имеет полного ранга, тогда метод 'lm' возвращает матрицу, заполненную np.inf, с другой стороны, методы 'trf' и 'dogbox' используют псевдообратную Мура-Пенроуза для вычисления ковариационной матрицы.

Вы можете попробовать любой из других методов, используя method='trf' или method='dogbox', чтобы посмотреть, сработает ли это.

Но может случиться так, что по крайней мере две из вашей переменной настроятся одинаково вещь и не являются независимыми.

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

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

...