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