python - SciPy:将参数传递给 optimize.shgo 函数

标签 python scipy arguments scipy-optimize shgo

我正在尝试使用在 SciPy 中实现的 SHGO 算法,但当目标函数采用多个参数时我遇到了麻烦。如果我正确理解错误,我不会按预期将额外的参数(参数)传递给目标函数,但是,我看不出我的语法在哪里错误。 谁能解释错误的根本原因是什么以及如何解决?

以下是我面临的问题的可重现示例。
Image presenting the mathematical formulation of the problem implemented in the Python code

import numpy as np
import scipy.optimize as opt


def fobj(x, y, z):
    return (x+y+z).sum()

x0 = np.array([0.5, 0.5, 0.5, 0.5])
y = np.array([1, 3, 5, 7])
z = np.array([10, 20, 30, 40])
bnds = list(zip([0, 1, 2, 3], [2, 3, 4, 5]))
cons = {'type': 'eq', 'fun': lambda x: x.sum() - 14}
min_kwargs = {'method': 'SLSQP', 'options': {'maxiter': 100, 'disp': True}}
ret = opt.shgo(func=fobj, bounds=bnds, args=(y, z), constraints=cons, minimizer_kwargs=min_kwargs, options={'disp': True})

运行时会显示以下回溯。

Splitting first generation
Traceback (most recent call last):
  File "C:\path\lib\site-packages\scipy\optimize\_shgo_lib\triangulation.py", line 630, in __getitem__
    return self.cache[x]
KeyError: (0, 0, 0, 0)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\path\lib\site-packages\scipy\optimize\_shgo.py", line 420, in shgo
    shc.construct_complex()
  File "C:\path\lib\site-packages\scipy\optimize\_shgo.py", line 733, in construct_complex
    self.iterate()
  File "C:\path\lib\site-packages\scipy\optimize\_shgo.py", line 876, in iterate
    self.iterate_complex()
  File "C:\path\lib\site-packages\scipy\optimize\_shgo.py", line 895, in iterate_hypercube
    self.HC = Complex(self.dim, self.func, self.args,
  File "C:\path\lib\site-packages\scipy\optimize\_shgo_lib\triangulation.py", line 25, in __init__
    self.n_cube(dim, symmetry=symmetry)
  File "C:\path\lib\site-packages\scipy\optimize\_shgo_lib\triangulation.py", line 76, in n_cube
    self.C0.add_vertex(self.V[origintuple])
  File "C:\path\lib\site-packages\scipy\optimize\_shgo_lib\triangulation.py", line 634, in __getitem__
    xval = Vertex(x, bounds=self.bounds,
  File "C:\path\lib\site-packages\scipy\optimize\_shgo_lib\triangulation.py", line 557, in __init__
    self.f = func(x_a, *func_args)
  File "C:\path\lib\site-packages\scipy\optimize\_optimize.py", line 466, in function_wrapper
    fx = function(np.copy(x), *(wrapper_args + args))
TypeError: fobj() takes 3 positional arguments but 5 were given

我不明白为什么会引发 TypeError。它说 5 个参数而不是 3 个参数被传递给目标函数 fobj,但据我所知,我只传递了 (y, z),所以我可以看看他们 5 个人怎么样!
请注意,我还尝试将本地最小化器字典重写为 min_kwargs = {'method': 'SLSQP', 'args': (x0), 'options': {'maxiter': 100, 'disp' : True}},但我一直面临同样的错误。我确信我传递的参数不正确,但我不明白如何正确地传递。任何帮助将不胜感激。


我正在使用:Python 3.10.5、Numpy 1.22.4 和 SciPy 1.8.1。

最佳答案

如您所见,问题是 bug in shgo .

您可以通过避免使用args 参数来避免shgo 中的错误。不使用 args,而是使用 fobj 的包装器在闭包中捕获 yz。一种简单的方法是使用 lambda 表达式:将 shgo 的第一个参数从 func=fobj 更改为 func=lambda x, y=y, z=z: fobj(x, y, z),并从调用中移除 args 参数。

关于python - SciPy:将参数传递给 optimize.shgo 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72794609/

相关文章:

python - 使用 "subplot2grid"方法将子图添加到特定图形

python - Selenium 未向输入字段发送波浪字符 (~)

python - 如何理解卡方列联表

c++ - 没有函数模板 "max"的实例匹配参数列表参数类型是 (int, int)

c - 我需要将 function1 的参数传递给 function1 内的另一个 function2

generics - 如何接受一个不太通用但动态的类型作为子类的参数?

python - Django REST 框架 : type object X has no attribute 'get_extra_actions'

python - 如何忽略pymysql警告?

python - 在稀疏矩阵中找到非零 block 并进行处理

python - Scipy basinhopping 不尊重 stepsize?