强制scipy.moptimity.curve_fit()返回上次确定的失败拟合参数



我需要为分块分析准备大量的拟合。问题是,对于一些回归,这种阻塞会产生非常分散("糟糕"(的数据。这是无法修复的,因为数据是MD模拟的相关能量值,如果我的同学们的结果可以作为参考的话,这似乎是一个自然的结果

我试图通过使用try捕获来绕过scipy.optimize.curve_fit()抛出的RuntimeError。我想,也许曲线拟合的每次迭代的结果都会保存在我的popt变量中,它存储了我函数的最佳参数。这样,即使我得到了RuntimeError,我仍然得到了最后的参数,我的迭代超过150次也不会崩溃。

然而,事实并非如此。我得到的不是RuntimeError,而是UnboundLocalError,因为在try-catch之后定义两个新变量a,b时,我试图引用popt。所以我想问我如何才能强制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-catch中失败,就不会定义它,所以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

一种方法是在try-except块之前设置a, b = np.nan, np.nan,并将a, b = popt拆包移动到try子句中。通过这种方式,您可以稍后处理失败的拟合(即nans(。

最新更新