如何在Python中优化黑盒函数?

6

我需要优化一个函数,但我无法获取其导数、海森矩阵或雅可比矩阵(因此标题中有“黑盒”一词)。假设我的函数看起来像这样:

def my_fun(some_int, some_other_int, some_string):
    return float(some_int + some_other_int + len(some_string))

请注意,我仅执行强制类型转换以显示该函数返回浮点数。
搜索空间/约束/边界(或您称之为什么)将是:
some_int = [1..10] # int interval
some_other_int = [1, 2, 3] # int discrete
some_string = ["methodA", "methodB", "methodC"] #discrete

我应该如何在Python中表述问题?这是我目前所搜索到的:

  • Scipy 优化器 似乎不接受适用于我的情况下的Nelder-Mead Simplex(或Powell方法)的约束条件
  • PyOpt...好吧,我无法避免使用多元目标函数
  • 还有Pyswarm。有人知道如何在Pyswarm中实现吗?

有什么想法吗?


1
关于约束的Nelder-Mead算法:我曾经遇到过同样的问题,从http://de.mathworks.com/matlabcentral/fileexchange/8277-fminsearchbnd--fminsearchcon下载了Matlab代码,并将其重写为Python以解决我的问题。希望这可以帮到你。 - alexblae
2
更准确地描述“黑盒”特性。如果函数求值便宜,使用有限差分法获取梯度应该没有问题。 - sascha
是的,我认为它相当便宜。评估本身大约需要6秒钟,但搜索空间相对较小。在这种情况下,您能否提供一个例子? - Lorah Attkins
2
如果没有梯度信息,Scipy将自动执行此操作。但是,尽管6秒可能对此来说是昂贵的,但您有一个更大的问题:离散状态空间。 Scipy中唯一支持此功能的优化器可能是basinhopping和differential_evolution(我从未使用过)。它们都是无梯度的,并且在这里可能是可行的方法。但是让我警告您:非凸混合离散连续黑盒(嘈杂)优化是所有情况中最糟糕的。另一种选择(但首先请尝试Scipy):[rbfopt(Coin OR的一部分)](https://github.com/coin-or/rbfopt) - sascha
3
你可以尝试使用 https://scikit-optimize.github.io/。它实现了基于顺序模型的优化,适用于计算昂贵且梯度未知的目标函数。(我是 skopt 的作者之一) - betatim
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接