gpt4 book ai didi

python - 我应该如何 scipy.optimize 具有边界的多元且不可微的函数?

转载 作者:太空宇宙 更新时间:2023-11-03 21:48:21 24 4
gpt4 key购买 nike

我遇到以下优化问题:

目标函数是一个多变量且不可微的函数,它将标量列表作为参数并返回标量。它是不可微的,因为函数内的计算基于 pandas 和一系列滚动、std 等操作。

伪代码如下:

def target_function(x: list) -> float:
# calculations
return output

此外,x 参数的每个组件都有自己的边界,定义为元组 (min, max)。那么我应该如何使用 scipy.optimize 库来找到这个函数的全局最小值呢?还有其他图书馆可以提供帮助吗?

我已经尝试过 scipy.optimize.brute,它花了我很长时间,也尝试过 scipy.optimize.minimize,它从未产生过看似正确的答案。

最佳答案

basinhoppingbrute Differential_evolution 是可用于全局优化的方法。正如您已经发现的,强力全局优化不会特别有效。

差分进化是一种随机方法,应该比暴力法做得更好,但可能仍然需要大量的目标函数评估。如果您想使用它,您应该使用这些参数,看看什么最适合您的问题。如果您知道您的目标函数不“平滑”,那么这种方法往往比其他方法效果更好:函数或其导数可能存在不连续性。

另一方面,盆地跳跃会进行随机跳跃,但也会在每次跳跃后使用局部松弛。如果您的目标函数有许多局部极小值,但由于使用了局部松弛,该函数应该是平滑的,这非常有用。如果您无法轻松获得函数的梯度,您仍然可以尝试使用不需要此信息的局部最小化器之一进行盆地跳跃。

scipy.optimize.basinhopping的优势惯例是它非常可定制。您可以使用 take_step 定义自定义随机跳转,使用 accept_test 覆盖用于决定是继续还是放弃随机跳转和松弛结果的测试,以及 minimizer_kwargs 调整局部最小化行为。例如,您可以重写 take_step 以保持在您的范围内,然后选择 L-BFGS-B 最小化器,它可以以数字方式估计函数的梯度并获取参数的范围。如果你给它一个梯度,L-BFGS-B 确实会工作得更好,但我在没有梯度的情况下使用它,它仍然能够很好地最小化。请务必阅读本地和全局优化例程中的所有参数,并调整容差等内容以提高性能。

关于python - 我应该如何 scipy.optimize 具有边界的多元且不可微的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52306399/

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