如何为scipy.optimize确定合理的初始猜测?

我正在使用scipy.optimize.minimize来寻找一个4D函数的最小值,这个函数对初始猜测非常敏感。如果我稍微改变初始猜测,解就会有很大的变化。

在Stack Overflow上已经有许多类似的问题(例如:123),但没有真正的答案。

在我的一个旧问题中,zunzun.com网站的一位开发者(显然已不再在线)解释了他们是如何处理这个问题的:

Zunzun.com使用差分进化遗传算法(DE)来寻找初始参数估计,然后将这些估计传递给scipy中的Levenberg-Marquardt求解器。DE实际上并不是作为一个全局优化器使用,而是作为一个“初始参数猜测器”。

我找到的最接近这个算法的答案是这个回答,其中使用了一个for块来多次调用最小化函数,并使用随机的初始猜测。这会生成多个最小化解,最后选择最佳(最小值)的解。

在Python中是否已经实现了zunzun开发者描述的类似方法?


回答:

对于这样的问题没有普遍的答案,因为最小化任意函数的问题是无法解决的。你可以在特定类型的函数上做得更好或更差,因此这更像是数学家的领域,他们需要分析你的函数可能是什么样的。

显然,你也可以使用数十种所谓的“元优化器”,这些只是大量的启发式方法,可能会(也可能不会)适用于你的特定应用。这些包括在循环中随机采样起始点,使用遗传算法,或者——据我所知是最有数学依据的方法——使用贝叶斯优化。总的来说,基本思想是在尝试最小化函数的同时对其进行建模,这样你就可以做出明智的猜测,决定下一次从哪里开始(这比随机猜测或使用遗传算法/差分进化更高一级的抽象)。因此,我会按以下方式对这些方法进行排序:

  • 网格搜索/随机采样 – 不使用之前运行的信息,因此结果最差
  • 遗传方法、进化、盆地跳跃、退火 – 使用之前运行的信息作为(x, f(x))对,在有限的时间内(几代) – 因此结果一般
  • 贝叶斯优化(及其类似方法) – 使用所有之前的经验,通过对基础函数的建模并基于预期改进进行采样选择 – 最佳结果(以最复杂的方法为代价)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注