修改 - 解决了问题
我正在从最小二乘拟合转换此代码,并认为我已将do_fit
中的所有返回值从数组(根据scipy.optimize.leastsq
的要求)更改为标量(根据{{1的要求) }})。
但是,我忘了更改scipy.optimize.basinhopping
开头的一行,检查从calc_res
传递给它的试验参数是否超出界限。如果是,则返回一个巨大的残余数组。将此转换为巨大的残差标量后,我的代码运行正常,因为无论参数是否在边界内,标量都会返回。
原帖
我在使用basinhopping
算法时遇到了一些问题,该算法在scipy.optimize.basinhopping
文件的深处给出了一个错误,特别是optimize.py
。我已经确认我的目标函数(“calc_res”)确实按照要求返回了一个标量(在我的例子中,是残差平方的总和),但我仍然得到approx_fprime
错误。
我通过以下代码调用了盆景算法:
setting an array element with a sequence
最小化函数中的残差计算看起来像
def do_fit(vp,fp,vp_ids,fp_ids,exp_data):
#vp = variable params, fp = fixed params
#vp_ids, fp_ids are lists of ints (id #'s) which keep track
# of which params are variable/fixed
minimizer_kwargs= {"method":"L-BFGS-B",
"args":(fp,vp_ids,fp_ids,exp_data)}
anneal_T = 100e-3
stepsize = 100e-3
f = opt.basinhopping(calc_res, vp,
niter=100,
T=anneal_T,
stepsize=stepsize,
minimizer_kwargs=minimizer_kwargs,
accept_test=None,
disp=True)
return f
它计算前几个值很好(我可以看到结果是一个标量),但后来我得到了这个错误代码
def calc_res(vp,fp,vp_ids,fp_ids,exp_data):
########
######## Fit calculations removed for clarity
########
res = data - fit
res_sum = np.sum(res**2)
#to confirm scalar is being return (type = <class 'numpy.float64'>)
ty = type(res_sum)
print('type = ',ty);sys.stdout.flush()
return res_sum
提前感谢您的帮助。