【问题标题】:options of the function scipy.optimize.minimize函数 scipy.optimize.minimize 的选项
【发布时间】:2015-02-20 19:11:05
【问题描述】:

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

我填写了选项maxitermaxfevxtolftol,但我并不真正理解这些选项,因为我试图在我的函数中添加print,我注意到算法评估它超过maxfev 次,但是当它达到最大值点时,它会发送一个错误“达到最大迭代次数”。

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

我的代码:

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})

谢谢。

【问题讨论】:

    标签: python optimization options minimize


    【解决方案1】:

    您可能应该在 scipy 邮件列表,甚至 scipy 开发者邮件列表中询问这个问题,但是查看 Nelder-Mead 算法的 source code,我注意到对 maxitermaxfev 的实际检查是在外部while循环中。该函数在该 while 循环中被多次调用,因此函数评估的实际数量很容易超过maxfev。 对于鲍威尔的方法,main loop 内部也发生了类似的事情。对于该方法,在测试评估次数(N 参数数量)之前,似乎对函数进行了N 次评估。

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

    【讨论】:

      猜你喜欢
      • 2014-05-15
      • 2016-08-30
      • 2020-10-08
      • 2022-01-15
      • 1970-01-01
      • 2019-11-10
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多