【问题标题】:Function to determine a reasonable initial guess for scipy.optimize?确定 scipy.optimize 的合理初始猜测的函数?
【发布时间】:2016-05-19 22:55:13
【问题描述】:

我正在使用scipy.optimize.minimize 来查找对所使用的初始猜测相当敏感的 4D 函数的最小值。如果我稍微改变一下,解决方案就会发生很大变化。

SO 中已经有很多类似的问题(例如:123),但没有真正的答案。

在我的一个老问题中,zunzun.com 网站的one of the developers(显然是no longer online)解释了他们是如何做到这一点的:

Zunzun.com 使用差分进化遗传算法 (DE) 来查找初始参数估计值,然后将其传递给 scipy 中的 Levenberg-Marquardt 求解器。 DE 本身实际上并没有用作全局优化器,而是用作“初始参数猜测器”。

我发现最接近该算法的是this answer,其中for 块用于多次调用最小化函数,并带有随机初始猜测。这会生成多个最小化的解决方案,并最终选出最佳(最小值)的一个。

有没有类似于 zunzun dev 描述的已经用 Python 实现的东西?

【问题讨论】:

  • 您的问题似乎与this 一个(虽然旧)非常相似。答案引用了anneal,它使用了经常用来代替 GA 算法的模拟退火。他们还提到 PyEvolve 作为提供遗传算法的库。
  • anneal 已被弃用,但显然basin-hopping 完全符合我的要求。您想以答案的形式发布您的 cmmt 吗?
  • 我已经成功地使用DEAP 实现了遗传算法。 sklearn.grid_search 也有各种穷举和随机的超参数优化方法。

标签: python machine-learning scipy mathematical-optimization hyperparameters


【解决方案1】:

此类问题没有通用答案,因为最小化任意函数的问题不可能解决。您可以在特定类别的函数上做得更好或更差,因此它是数学家的一个领域,可以分析您的函数可能的样子。

显然,您还可以使用几十个所谓的“元优化器”,它们只是一堆启发式方法,可能(或不)适用于您的特定应用程序。这些包括循环中的随机采样起点,使用遗传算法,或者 - 据我所知,这是数学上最合理的方法 - 使用贝叶斯优化。一般来说,这个想法是在您尝试最小化函数的同时对函数进行建模,这样您就可以做出明智的猜测下一次从哪里开始(这是比随机猜测或使用遗传算法/差分进化更高的抽象级别) .因此,我将按以下方式订购这些方法

  • 网格搜索/随机抽样 - 不使用以前运行的信息,因此 - 最差的结果
  • 遗传方法、进化、盆地循环、退火 - 在有限的时间段(世代)内将先前运行的信息作为 (x, f(x)) 对使用 - 从而获得平均结果
  • 贝叶斯优化(和类似方法) - 使用来自所有先前经验的信息,通过基础函数建模和基于预期改进执行抽样选择 - 最佳结果(以最复杂的方法为代价)

【讨论】:

  • 很好的答案,非常详细。谢谢lejlot!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 2016-01-18
相关资源
最近更新 更多