gpt4 book ai didi

python - 优化 python 中令人讨厌的函数 - 错误

转载 作者:太空宇宙 更新时间:2023-11-03 18:30:45 26 4
gpt4 key购买 nike

我正在尝试最小化一个包含三个变量的函数,该函数是非线性的,而且非常大且令人讨厌。它在 Matlab 中工作得很好,但我正在尝试转移到 python(作为一种学习经验和更多自由)。不管怎样,它确实适用于最小化函数“Nelder-Mead”,但它给了我一个没有意义的输出,所以我试图为我的变量添加界限。

代码如下:

bnds = ((0, 1), (0, 1), (0, 1))
x0 = [0.004, 0.1, 0.1]
res = minimize(myObjFun, x0, method='L-BFGS-B', bounds=bnds)
print(res)
Matlab 的输出给出了最小化函数的三个值:[0.2182, 0.0684, 0.0048],而 python 中的 Nelder-Mead 给出了完全不同的东西,并且超出了我想要的范围(应该在 0 和1).

错误如下:

File "****/fixedpoints.py", line 45, in <module>
res = minimize(myObjFun, x0, method='L-BFGS-B', bounds=bnds)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/_minimize.py", line 380, in minimize
callback=callback, **options)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/optimize/lbfgsb.py", line 304, in _minimize_lbfgsb
isave, dsave)
TypeError: _lbfgsb.setulb() 6th argument (f) can't be converted to double

最佳答案

除非您给我们myObjFun,否则我们无法调试或在优化期间具有类似行为的类似函数(基于更简单或伪造的数据)。更具体地说,您的代码将在表现良好的 myObjFun 上运行;例如,

>>> import scipy.optimize
>>> def myObjFun(x):
return (x[0]-.2182)**4 + (x[1]-.0684)**2 + 5*(x[2]-.0048)**2 + 3.2
>>> print scipy.optimize.minimize(myObjFun, [0.004,0.1,0.1], method='L-BFGS-B', bounds=((0,1),(0,1),(0,1)))
status: 0
success: True
nfev: 18
fun: 3.200000001787815
x: array([ 0.21213686, 0.06837957, 0.00480194])
message: 'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'
jac: array([ -8.88178420e-07, -4.08562073e-05, 1.94511074e-05])
nit: 17

现在 setulb 的参数 f 包含正在评估函数时目标函数的当前值 [1] :

   f is a double precision variable.
On first entry f is unspecified.
On final exit f is the value of the function at x.

因此,在搜索空间上的某个点计算的目标函数的值似乎无意中由于某种原因而无法转换为 float (这似乎是一个 TypeError)。

我可以得到一个类似的错误(但实际上是 OverflowError ),这个目标函数通常表现良好,但每当 x[1] < 0.0685 时就会爆炸。 (这应该在找到最小值之前发生):

>>> def myObjFun(x):                                                                                       
return (x[0]-.2182)**4 + (x[1]-.0684)**2 + 5*(x[2]-.0048)**2 + 3.2 if x[1] > 0.0684 else 10**999
....:

>>> print scipy.optimize.minimize(myObjFun, [0.004,0.1,0.1], method='L-BFGS-B', bounds=((0,1),(0,1),(0,1)))
---------------------------------------------------------------------------
OverflowError Traceback (most recent call last)
<ipython-input-44-9204b704b51a> in <module>()
----> 1 print scipy.optimize.minimize(myObjFun, [0.004,0.1,0.1], method='L-BFGS-B', bounds=((0,1),(0,1),(0,1)))

lib/python2.7/site-packages/scipy/optimize/_minimize.pyc in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
376 elif meth == 'l-bfgs-b':
377 return _minimize_lbfgsb(fun, x0, args, jac, bounds,
--> 378 callback=callback, **options)
379 elif meth == 'tnc':
380 return _minimize_tnc(fun, x0, args, jac, bounds, callback=callback,

lib/python2.7/site-packages/scipy/optimize/lbfgsb.pyc in _minimize_lbfgsb(fun, x0, args, jac, bounds, disp, maxcor, ftol, gtol, eps, maxfun, maxiter, iprint, callback, **unknown_options)
302 _lbfgsb.setulb(m, x, low_bnd, upper_bnd, nbd, f, g, factr,
303 pgtol, wa, iwa, task, iprint, csave, lsave,
--> 304 isave, dsave)
305 task_str = task.tostring()
306 if task_str.startswith(b'FG'):

OverflowError: _lbfgsb.setulb() 6th argument (f) can't be converted to double

因此,我会仔细检查您的 myObjFun 并在搜索域中的许多点手动评估它,并查看返回的值是否合理且类型正确,并且与 matlab 返回的值相匹配。

关于python - 优化 python 中令人讨厌的函数 - 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22418531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com