Python 函数scipy.optimize.minimize的选项

Python 函数scipy.optimize.minimize的选项,python,optimization,options,minimize,Python,Optimization,Options,Minimize,我试图最小化一个很长的函数(它是子函数500000部分的总和),以便将一些参数拟合到概率模型中。我使用scipy.optimize.minimize函数。我尝试了Powell和Nelder-Mead两种算法,在我的设置中,Powell看起来真的更快。但是,我真的不明白如何在给定的时间后强制流程给我一些结果,即使它们不是“最优的” 我填充了选项maxiter、maxfev、xtol和ftol,但我并不真正理解这些选项,因为我试图在函数中放入打印,我注意到算法对它的求值次数超过maxfev次,但当它

我试图最小化一个很长的函数(它是子函数500000部分的总和),以便将一些参数拟合到概率模型中。我使用
scipy.optimize.minimize
函数。我尝试了
Powell
Nelder-Mead
两种算法,在我的设置中,Powell看起来真的更快。但是,我真的不明白如何在给定的时间后强制流程给我一些结果,即使它们不是“最优的”

我填充了选项
maxiter
maxfev
xtol
ftol
,但我并不真正理解这些选项,因为我试图在函数中放入
打印
,我注意到算法对它的求值次数超过
maxfev
次,但当它到达maxiter点时,它发送了一个错误“达到的最大迭代次数”

有谁能解释一下我使用的两种算法是如何工作的吗?文档还不清楚

我的代码:

def log_likelihood(r, alpha, a, b, customers):
    if r <= 0 or alpha <= 0 or a <= 0 or b <= 0:
        return -np.inf
    c = sum([log_likelihood_individual(r, alpha, a, b, x, tx, t) for x, tx, t in customers])
    print -c
    return c

negative_ll = lambda params: -log_likelihood(*params,customers=customers)
params0 = (1, 1, 1, 1)
res = minimize(negative_ll, params0, method='Powell', callback=print_callback, options={'disp': True, 'ftol':0.05, 'maxiter':3, 'maxfev":15})
def log_可能性(r、alpha、a、b、客户):

如果r你可能应该在scipy邮件列表上,甚至在scipy开发者邮件列表上问这个问题,但是看看Nelder-Mead算法,我注意到,
maxiter
maxfev
的实际检查在外部while循环中。函数在while循环中被调用了几次,因此函数的实际数量离子计算可以轻松超过
maxfev
。 类似的情况也发生在for Powell方法中。对于该方法,在测试求值次数(
N
参数的数量)之前,函数被求值
N次

我想这样做是因为否则在核心循环中会有太多的
if
语句来检查
maxfev
,而将条件置于内部循环之外被认为更快/更清晰