对于任何可以表示为函数的标准,都可以停止迭代x
。这里的想法是劫持callback
方法并使用异常进行流量控制。以下是利用这个想法的两个解决方案:
from scipy.optimize import fmin_bfgs
import numpy as np
f = lambda x: np.linalg.norm(x**2)
x0 = np.random.rand(100)
解决方案一:
global result
class SmallEnoughException(Exception):
pass
def check_conv_criteria(xk):
global result
if np.linalg.norm(xk) < 0.1:
result = xk
raise SmallEnoughException()
try:
x, _, _ = fmin_bfgs(f, x0, callback=check_conv_criteria)
except SmallEnoughException:
x = result
解决方案2:
class StopOptimizingException(Exception):
pass
class CallbackCollector:
def __init__(self, f, thresh):
self._f = f
self._thresh = thresh
def __call__(self, xk):
if self._f(xk) < self._thresh:
self.x_opt = xk
raise StopOptimizingException()
try:
cb = CallbackCollector(f, thresh=0.2)
x, _, _ = fmin_bfgs(f, x0, callback=cb)
except StopOptimizingException:
x = cb.x_opt