Scipy最小化迭代过界

2024-05-16 02:01:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用scipy最小化3个输入变量的函数。函数如下所示-

def myfunc(x):
    x[0] = a
    x[1] = b
    x[2] = c
    n = f(a,b,c)
    return n

bound1 = (80,100)
bound2 = (10,20)
bound3 = (312,740)
guess = [a0,b0,c0]
bds = (bound1,bound2,bound3)
result = minimize(myfunc, guess,method='L-BFGS-B',bounds=bds)

我当前尝试运行的函数在a=100b=10c=740达到最小值,该值位于边界的末尾

minimize函数不断尝试迭代超过绑定3的末尾(在最后一次迭代中获得740.0000000149012的c0值)

有没有办法阻止这种情况发生?即在我的边界实际结束时停止迭代


Tags: 函数returndefscipymyfunca0边界末尾
1条回答
网友
1楼 · 发布于 2024-05-16 02:01:37

这是由于数值微分,它本身不仅需要推断步长方向和大小,还需要推断终止

一般来说,对于正在使用的任何解算器(并且有许多后端解算器),如果不非常小心,您将无法做很多事情。基本思想是用您提供的方法替换自动数值微分:然后这一个尊重那些边界,并且必须小心解算器内部,例如“如何推断终止于此端”

修正一个:

当使用:Pull-request #10673时,您的问题应该自动消失,这涉及到您的配置:L-BFGS-B

看起来,此PR不是当前版本SciPy 1.4.1的一部分(因为这是PR之前的2个月)

另请参见#6026,其中提到了1.5.0的里程碑,涉及一些变化,包括关于num diff中的边界

对于上述PR,您需要从以下来源安装scipy:

  • linux上非常可行(可能还有os x)
  • 您不应该在windows上尝试这些功能!
    • 相信我

如果需要,请参阅文档

修正B:

除此之外,当您在进行无约束优化(具有可变边界)时,可以使用更多的解算器后端(与约束优化相比),您可以尝试另一个解算器trust-constr,它对此有明确的支持,请参见#9098

请注意,在设置边界时,您需要显式地发出信号

相关问题 更多 >