Scipy 最小化迭代越界
Scipy minimize iterating past bounds
我正在尝试使用 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=100
、b=10
、c=740
处达到最小值,这是边界的末端。
最小化函数不断尝试迭代越过边界 3 的末尾(在最后一次迭代中达到 740.0000000149012
的 c0 值。
有什么办法可以阻止这种情况发生吗?即在我的边界的实际结束时停止迭代?
这是由于数值微分,它本身不仅需要推断步长方向和大小,而且还需要推断终止.
一般来说,如果不非常小心地使用任何求解器(并且有许多后端求解器),您将无能为力。基本思想是用你提供的替换 automatic numerical-differentiation:然后这个 respects those bounds 和必须小心求解器内部,例如"how to reason about termination at this end".
修复 A:
您的问题应该自动消失 使用时: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.
请注意,您需要在设置边界时明确指出这一点!
我正在尝试使用 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=100
、b=10
、c=740
处达到最小值,这是边界的末端。
最小化函数不断尝试迭代越过边界 3 的末尾(在最后一次迭代中达到 740.0000000149012
的 c0 值。
有什么办法可以阻止这种情况发生吗?即在我的边界的实际结束时停止迭代?
这是由于数值微分,它本身不仅需要推断步长方向和大小,而且还需要推断终止.
一般来说,如果不非常小心地使用任何求解器(并且有许多后端求解器),您将无能为力。基本思想是用你提供的替换 automatic numerical-differentiation:然后这个 respects those bounds 和必须小心求解器内部,例如"how to reason about termination at this end".
修复 A:
您的问题应该自动消失 使用时: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.
请注意,您需要在设置边界时明确指出这一点!