Заставить scipy.optimize.curve_fit () вернуть последние определенные параметры неудачной подгонки? - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужно предварительно сформировать большое количество посылок для анализа блокировки. Проблема в том, что эта блокировка дает очень разбросанные («плохие») данные по некоторым регрессиям. Это не может быть исправлено, так как данные являются коррелированными значениями энергии из симуляции МД и кажутся естественным результатом, если результаты моих сокурсников могут быть чем-то интересными.

Я пытался обойти RuntimeError, которые бросает scipy.optimize.curve_fit(), используя try catch. Я думал, что, возможно, результат каждой итерации подбора кривой будет сохранен в моей переменной popt, в которой хранятся оптимальные параметры моей функции. Таким образом, даже если я получу RuntimeError, я все равно получу последние параметры, и моя итерация более 150 посылок или около того не потерпит крах.

Однако это не так. Вместо RuntimeError я получаю UnboundLocalError, потому что я пытаюсь ссылаться на popt при определении двух новых переменных a,b после попытки catch. Поэтому я хотел спросить, как я могу заставить curve_fit() дать мне соответствующие параметры, даже если он считает, что они неверны.

Вот фрагмент кода, с которым я исследовал проблему:

def G_sol(df):
    for index,lam in enumerate(df.columns):
        List = list(df.loc[:,lam])
        List = [np.float64(l) for l in List]

        # iterate over blocks.
        y, x = np.array([(ineff, segm) for ineff, segm in blocks(List)]).transpose()

        # Not all regressions will work due to bad data.
        # This prevents the loop from crashing and returns
        # the last result of the optimization.
        try:
            print('lol')
            popt, popt_cov = optimize.curve_fit(fit, x, y, method='lm')
            print(popt)
        except RuntimeError:
            pass

        a,b = popt[0],popt[1]

print('lol') все еще выполняется, а print(popt) - нет. Я предполагаю, что это означает, что это уже пошло в блок кроме. Очевидно, popt не определен, если он завершается с ошибкой в ​​попытке try, поэтому он не может определить a,b.

Полный возврат, если вам интересно:

Traceback (most recent call last):

  File "<ipython-input-19-3449f530a001>", line 1, in <module>
    runfile('/local/ego/GsolveSideChains/blocking.py', wdir='/local/nelle/GsolveSideChains')

  File "/usr/local/linux/shared_soft/python/python3.6/anaconda5.1.0_ML/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py", line 668, in runfile
    execfile(filename, namespace)

  File "/usr/local/linux/shared_soft/python/python3.6/anaconda5.1.0_ML/lib/python3.6/site-packages/spyder_kernels/customize/spydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/local/ego/GsolveSideChains/blocking.py", line 225, in <module>
    G_solv = G_sol(Paths)

  File "/local/ego/GsolveSideChains/blocking.py", line 190, in G_sol
    a,b = parms[0],parms[1]

UnboundLocalError: local variable 'parms' referenced before assignment

1 Ответ

0 голосов
/ 08 ноября 2019

Один из способов - установить a, b = np.nan, np.nan перед блоком try-exc и переместить a, b = popt распаковку в предложение try. Таким образом, вы можете позже справиться с неудачными подгонками (например, с nans).

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