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

如何在Python中优化黑盒函数?,python,scipy,mathematical-optimization,Python,Scipy,Mathematical Optimization,我有一个要优化的函数,我无法从中得到导数、Hessian或Jacobian(因此标题中有“黑匣子”)。假设我的函数如下所示: 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

我有一个要优化的函数,我无法从中得到导数、Hessian或Jacobian(因此标题中有“黑匣子”)。假设我的函数如下所示:

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单纯形(或Powell方法)的约束
  • 。。。我不能用多元目标函数
  • 还有。有人知道如何在Pyswarm中做到这一点吗
有什么想法吗?

您可以使用它的黑盒优化库:

它支持不同类型的参数。

您可以使用它的黑盒优化库:


它支持不同类型的参数。

关于受约束的Nelder Mead:我曾经遇到过同样的问题,我从中获取了matlab代码,并专门针对我的问题将其改写为python。希望这能有所帮助。更准确地描述
黑盒子的本质。如果函数求值很便宜,那么使用有限差分来获得梯度应该没有问题。是的,我认为它相当便宜。评估本身大约需要6秒钟,但搜索空间相当小。在这种情况下,你能提供一个例子吗?如果没有梯度信息,Scipy会自动这样做。但是,尽管6秒的代价可能会很高,但还有一个更大的问题:离散状态空间。scipy中唯一支持这一点的优化器可能是basinhopping和differential_evolution(我从未使用过)。在这里,它们都是无梯度的和可能的方法。但我要警告你:非凸混合离散连续黑盒(噪声)优化是所有方案中最糟糕的。另一种选择(但先试试那些简单的):你可以试一试。它为计算成本高且不知道梯度的目标实施基于顺序模型的优化。(我是skopt的作者之一)关于受约束的Nelder Mead:我曾经遇到过同样的问题,我从中获取了matlab代码,并专门针对我的问题将其改写为python。希望这能有所帮助。更准确地描述
黑盒子的本质。如果函数求值很便宜,那么使用有限差分来获得梯度应该没有问题。是的,我认为它相当便宜。评估本身大约需要6秒钟,但搜索空间相当小。在这种情况下,你能提供一个例子吗?如果没有梯度信息,Scipy会自动这样做。但是,尽管6秒的代价可能会很高,但还有一个更大的问题:离散状态空间。scipy中唯一支持这一点的优化器可能是basinhopping和differential_evolution(我从未使用过)。在这里,它们都是无梯度的和可能的方法。但我要警告你:非凸混合离散连续黑盒(噪声)优化是所有方案中最糟糕的。另一种选择(但先试试那些简单的):你可以试一试。它为计算成本高且不知道梯度的目标实施基于顺序模型的优化。(我是skopt的作者之一)