函数确定scipy.optimize的合理初始猜测?

时间:2016-02-09 19:41:50

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

我正在使用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中实现了?

1 个答案:

答案 0 :(得分:3)

对于这样的问题没有一般性的答案,因为最大限度地减少任意功能的问题无法解决。你可以在特定类别的函数上做得更好或更差,因此它是数学家的一个领域,分析你的函数可能的样子。

显然,你也可以使用几十个所谓的“元优化器”,它们只是一堆启发式算法,它可能(或不会)为你的特定应用程序工作。那些包括循环中的随机抽样起点,使用遗传算法,或者 - 据我所知,大多数数学上合理的方法 - 使用贝叶斯优化。一般来说,当您尝试将函数最小化时,我们的想法是同时对函数进行建模,这样您就可以明智地猜测下次启动的位置(抽象级别高于随机猜测或使用遗传算法/差分进化) 。因此,我会按照以下方式订购这些方法

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