Python - неправильная посадка - PullRequest
1 голос
/ 14 января 2020

Я пытаюсь воспроизвести известный подходящий результат (сообщается в журнальной статье): применение степенной модели к данным. Как видно на графике-A ниже, я смог воспроизвести результат, используя известные параметры наилучшего соответствия.

<График-A: известный из литературы результат> Both axis: log-log scale

Однако я не смог самостоятельно определить параметры наилучшего соответствия.

wrong

Возвращает регистр-A,

OptimizeWarning: Covariance of the parameters could not be estimated (если Я опускаю несколько начальных точек данных, подбор возвращает некоторые результаты, которые не являются плохими, но все же отличаются от известного результата наилучшего соответствия) РЕДАКТИРОВАТЬ: сейчас я только что нашел новые сообщения об ошибках на этот раз ..: (1) RuntimeWarning: overflow encountered in power (2) RuntimeWarning: invalid value encountered in power

Дело-B (с первоначальной догадкой ближе к параметрам наилучшего соответствия) возвращает,

RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 5000. Если установить maxfev намного выше, чтобы учесть это сообщение об ошибке, подгонка работает, но возвращает неверный результат (очень неправильное соответствие по сравнению с наилучший результат).

1 Ответ

2 голосов
/ 15 января 2020

Как я прокомментировал:

Поскольку вы наносите данные на график log-log, подходите ли вы также для log (y) и log (x)? Поскольку ваши данные y изменяются на 5 или 6 порядков, если вы не умещаетесь в лог-пространстве, то будут иметь значение только те 3 или 4 точки данных с наибольшим значением y.

Очевидно, это было слишком тонкий намек. Поэтому я буду более прямолинейным: если вы строите графики в лог-пространстве, FIT IN LOG SPACE.

Но ваша модель очень склонна к генерации комплексных чисел из negative**fraction и NaN, что, несомненно, вызывало проблемы со всеми вашими припадками. ВСЕГДА распечатывайте наиболее подходящие параметры и ковариационную матрицу.

Итак, вам может потребоваться наложить ограничения на ваши параметры (конечно, я понятия не имею, верна ли ваша модель или, по вашему мнению, используется «правильный ответ»). Может быть, начать с чего-то вроде этого:

import matplotlib.pyplot as plt
from lmfit import Model
import numpy as np

# the data can be found at the end of this post.
xx, yy = np.genfromtxt('the_data', unpack=True)

# the BPL function
def bendp(x, A, x_bend, allo, alhi, c):
    numer = A * x**-allo
    denom = 1 + (x/x_bend)**(alhi-allo)
    out = (numer/denom) + c
    return  np.log(out)       ## <- TAKE THE LOG


mod = Model(bendp)
para = mod.make_params(A = 0.01, x_bend=1e-2, allo=1., alhi=2., c=1e-2)

# Note: your model is very sensitive # make sure A, x_bend, alhi, and c cannot be negative
para['A'].min = 0
para['x_bend'].min = 0
para['alhi'].min = 0
para['alhi'].max = 3
para['c'].min = 0


result = mod.fit(np.log(yy), para, x=xx) ## <- FIT THE LOG

print(result.fit_report())

plt.loglog(xx, yy, linewidth=0, marker='o', markersize=6)
plt.loglog(xx, np.exp(result.best_fit), 'r', linewidth=5)
plt.show()

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...