【问题标题】:Scipy.optimize.minimize is not giving the minimum value even though it sees that valueScipy.optimize.minimize 没有给出最小值,即使它看到了最小值
【发布时间】:2019-09-30 01:21:52
【问题描述】:

我正在使用 scipy.optimize.minimize 为我的目标函数找到最佳参数。

我的代码:


import numpy as np
from scipy.optimize import minimize
from scipy.optimize import Bounds

bounds = Bounds([26,26,8,6,400,100,0,25,2],[36,38,28,28,1800,800,100,50,7])

energy_history = []
x_values = []

def objective(x):
    x_trail = x.reshape(1,-1)
    x_trail = sc_X.transform(x_trail)
    y_trail = regressorSVR.predict(x_trail)
    y_trail = y_trail.reshape(1,-1)
    y_trail = sc_Y.inverse_transform(y_trail)
    return y_trail[0]


def callback(x,y):
    fobj = objective(x)
    energy_history.append(fobj)
    x_values.append(x)

x0 = np.array([26,28,15,7,400,377,40,43,4.3])
res = minimize(objective, x0, method='trust-constr',
               options={'verbose': 1}, bounds=bounds,callback=callback)

optimal_values = res.x
energy = res.fun

在给出初始值的情况下,我得到的最小值(res.fun)是-7.1。我正在创建一个列表(energy_history)来查看它是如何达到这个值的。我在该列表中看到了一些小于 -7.1 的值,但是为什么将 -7.1 作为最小值返回。

目标函数多次达到-21,但为什么仍然返回-7作为最小值?

【问题讨论】:

  • 请提供a Minimal, Complete, and Verifiable example。此代码甚至无法编译。顺便问一下,你为什么在没有任何限制的情况下使用trust-constr
  • 嗨@SuperKogito,目标函数是一个SVR回归模型。我无法显示包含数据和训练步骤的整个代码。会很长。这就是我展示结果的原因。我的输入参数有边界,这就是我使用约束优化技术的原因。
  • 我不认为那是一回事。 Imo BoundsConstraints 不同,这就是为什么在 Scipy 中您可以单独定义它们。我建议尝试使用不同的method,看看行为是否有变化。
  • 是的,BoundsConstraints 不同。 stackoverflow.com/questions/19244527/…关注这个问题的答案。
  • 我认为该函数不是凸函数,因此如果局部最小值也是全局的,那只是运气,在这种情况下,您可以尝试多次随机初始化并希望... :)

标签: python optimization scipy scipy-optimize scipy-optimize-minimize


【解决方案1】:

如果我们查看scipy.optimization 文档,我们可以看到scipy.optimize.minimize 列在local optimization 下。 主要问题是您的问题是非凸的,因此scipy.optimize.minimize 不能保证适当的收敛。由于它也是非常不可微的,因此许多算法根本不适合。

scipy.optimize 确实提供了一些全局优化算法,但可以在 global optimization 下的文档页面上找到,即 basinhoppingbrutedifferential_evolution。查看this answer 以获得一些简短的解释。

基本上你可以先试试brute,看看有没有系统问题。它基本上是一个蛮力解决方案,并且会很慢,但找到你的最小值。更复杂的方法是使用differential_evolution。由于您的函数不是很流畅,basinhopping 可能无法正常工作,但仍然值得一试,并且可能收敛速度最快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 2016-09-10
    • 2020-11-19
    • 1970-01-01
    • 2021-06-12
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多