Scipy Basinhopping:使用序列设置数组元素(approx_fprime)

时间:2014-07-14 18:53:14

标签: python python-3.x numpy scipy

修改 - 解决了问题

我正在从最小二乘拟合转换此代码,并认为我已将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

提前感谢您的帮助。

0 个答案:

没有答案