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

Python 强制scipy.optimize.curve_fit()返回上次确定的失败拟合参数?,python,python-3.x,scipy,Python,Python 3.x,Scipy,我需要进行大量的拟合以进行阻塞分析。问题是,对于某些回归,这种阻塞会产生非常分散的(“坏”)数据。这是无法修复的,因为数据与MD模拟的能量值相关,并且似乎是一个自然的结果,如果我的同学们的结果有任何依据的话 我试图通过使用trycatch来绕过scipy.optimize.curve\u fit()抛出的RuntimeError。我想也许每次曲线拟合迭代的结果都会保存在我的popt变量中,该变量存储了我函数的最佳参数。这样,即使我得到了运行时错误,我仍然得到了最后的参数,并且我的迭代超过150次

我需要进行大量的拟合以进行阻塞分析。问题是,对于某些回归,这种阻塞会产生非常分散的(“坏”)数据。这是无法修复的,因为数据与MD模拟的能量值相关,并且似乎是一个自然的结果,如果我的同学们的结果有任何依据的话

我试图通过使用
try
catch来绕过
scipy.optimize.curve\u fit()
抛出的
RuntimeError
。我想也许每次曲线拟合迭代的结果都会保存在我的
popt
变量中,该变量存储了我函数的最佳参数。这样,即使我得到了
运行时错误
,我仍然得到了最后的参数,并且我的迭代超过150次左右不会崩溃

然而,事实并非如此。我没有得到一个
RuntimeError
,而是得到了一个
UnboundLocalError
,因为在try catch之后定义两个新变量
a,b
时,我试图引用popt。所以我想问我如何才能强制
曲线拟合()
给我拟合参数,即使它认为这些参数不正确

下面是我用来检查问题的代码片段:

def G_sol(df):
对于索引,枚举中的lam(df.列):
列表=列表(df.loc[:,lam])
List=[np.float64(l)表示列表中的l]
#在块上迭代。
y、 x=np.array([(ineff,segm)表示ineff,segm表示块(列表)]).transpose()
#由于数据错误,并非所有回归都有效。
#这可以防止循环崩溃并返回
#优化的最后结果。
尝试:
打印('lol')
popt,popt_cov=优化曲线拟合(拟合,x,y,方法='lm')
打印(popt)
除运行时错误外:
通过
a、 b=popt[0],popt[1]
print('lol')
仍在执行,但是
print(popt)
没有执行。我想这意味着它已经到了另一个街区。显然,如果尝试捕获失败,
popt
没有定义,因此
a、b
不能由它定义

完全回溯,如果您感兴趣:

回溯(最近一次呼叫最后一次):
文件“”,第1行,在
运行文件('/local/ego/GsolveSideChains/blocking.py',wdir='/local/nelle/GsolveSideChains')
文件“/usr/local/linux/shared_soft/python/python3.6/anaconda5.1.0\u ML/lib/python3.6/site packages/spyder_kernels/customize/spyderrcustomize.py”,第668行,在运行文件中
execfile(文件名、命名空间)
文件“/usr/local/linux/shared_soft/python/python3.6/anaconda5.1.0\u ML/lib/python3.6/site packages/spyder_kernels/customize/spyderrcustomize.py”,第108行,在execfile中
exec(编译(f.read(),文件名,'exec'),命名空间)
文件“/local/ego/GsolveSideChains/blocking.py”,第225行,in
G_solv=G_sol(路径)
文件“/local/ego/GsolveSideChains/blocking.py”,第190行,G_sol格式
a、 b=参数[0],参数[1]
UnboundLocalError:赋值前引用的局部变量“parms”

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

我将此帖子的名称更改为popt,因为我认为使用scipy的人会更熟悉它。不过我忘了做追踪。我的错。