scipy优化中的自定义收敛准则

2024-09-29 19:22:55 发布

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

我使用scipy.optimize以以下方式优化函数:

yEst=minimize(myFunction, y0, method='L-BFGS-B', tol=1e-6).x

我的问题是,当公差小于某个值时(例如,如果在第n次迭代中stop是|y_n - y_(n-1)|<tol),我不想简单地停止。相反,我有一个稍微复杂一点的函数y_ny_(n-1),比如说tolFun,我想在tolFun(y_n, y_(n-1))<tol时停止。你知道吗

更详细地说,我的公差函数如下。它将y划分成块,然后检查是否有任何单个分区在公差范围内有范数差异,如果有,那么最小化应该停止。你知道吗

# Takes in current and previous iteration values and a pre-specified fixed scalar r.
def tolFun(yprev,ycurr,r):

  # The minimum norm so far (initialized to a big value)
  minnorm = 5000

  for i in np.arange(r):

    # Work out the norm of the ith partition/block of entries
    norm = np.linalg.norm(yprev[np.arange(r)+i*r],ycurr[np.arange(r)+i*r])

    # Update minimum norm
    minnorm = np.min(norm, minnorm)

  return(minnorm)

我的问题类似于this question here,但不同的是,这个用户只需要当前迭代值y,而我的自定义容差函数需要当前迭代值y和上一个值。有人知道我怎么做吗?你知道吗


Tags: andofthe函数innormnpminimum
1条回答
网友
1楼 · 发布于 2024-09-29 19:22:55

由于回调函数只接收当前参数向量,因此不能直接执行所需操作。要解决您的问题,您可以通过以下方式修改https://stackoverflow.com/a/30365576/8033585的第二个解决方案(我更喜欢使用global的第一个解决方案):

class Callback:
    def __init__(self, tolfun, tol=1e-8):
        self._tolf = tolfun
        self._tol = tol
        self._xk_prev = None

    def __call__(self, xk):
        if self._xk_prev is not None and self._tolf(xk, self._xk_prev) < self._tol:
            return True

        self._xk_prev = xk
        return False

cb = Callback(tolfun=tolFun, tol=tol)  # set tol here to control convergence
yEst = minimize(myFunction, y0, method='L-BFGS-B', tol=0, callback=cb)

或者

yEst = optimize.minimize(
    myFunction, y0, method='L-BFGS-B',
    callback=cb, options={'gtol': 0, 'ftol': 0}
)

可以使用以下方法查找解算器/方法的可用选项:

optimize.show_options('minimize', 'L-BFGS-B')

相关问题 更多 >

    热门问题