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