在scipy-brute优化中如何将最大迭代次数传递给fmin

2024-06-01 13:57:59 发布

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

我正在尝试在SciPy中进行强力优化。在

(进口)scipy.optimize公司作为spo)

res_brute = spo.brute(self.minimize_this, rranges, full_output=True, finish=spo.fmin)

我的问题是:我如何确保血氧饱和度N次迭代后停止?我似乎无法通过任何论据。在


Tags: selftrueoutput公司resscipythisfull
1条回答
网友
1楼 · 发布于 2024-06-01 13:57:59

^{}没有向最小化函数传递其他参数的选项,因此要覆盖默认行为,必须创建一个fmin的包装,并在包装中设置maxiter参数。包装器然后作为finish参数传递给brute。在

例如,假设我们希望

def func(x):
    return np.cos(3*x) + 0.25*(x-5)**2

在间隔[0,10]上,我们希望将fmin的最大迭代次数限制为4。下面是如何做到这一点(在ipython会话中)。在

首先,进口:

^{pr2}$

定义目标函数:

In [104]: def func(x):
     ...:     return np.cos(3*x) + 0.25*(x-5)**2
     ...: 

调用brute,为finish参数使用lambda表达式。lambda表达式只将其参数传递给fmin,以及full_output=True和{}。(与lambda表达式不同,您可以定义一个单独的函数来执行相同的操作。)

In [110]: brute(func, [slice(0, 10, 0.1)], finish=lambda func, x0, args=(): fmin(func, x0, args, full_output=True, maxiter=4))
Warning: Maximum number of iterations has been exceeded.
Out[110]: array([ 5.2325])

为了进行比较,以下是maxiter=100时的结果:

In [111]: brute(func, [slice(0, 10, 0.1)], finish=lambda func, x0, args=(): fmin(func, x0, args, full_output=True, maxiter=100))
Optimization terminated successfully.
         Current function value: -0.986810
         Iterations: 13
         Function evaluations: 26
Out[111]: array([ 5.2235498])

当我们在lambda表达式中对fmin的调用中不使用maxiter

In [112]: brute(func, [slice(0, 10, 0.1)], finish=lambda func, x0, args=(): fmin(func, x0, args, full_output=True))
Optimization terminated successfully.
         Current function value: -0.986810
         Iterations: 13
         Function evaluations: 26
Out[112]: array([ 5.2235498])

正如预期的那样,该结果与不重写finish相同:

In [113]: brute(func, [slice(0, 10, 0.1)])
Out[113]: array([ 5.2235498])

相关问题 更多 >