scipy.optimize.minimize 没有给出最小值,即使它看到该值

2023-12-02

我正在使用 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 被作为最小值返回。

image

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


如果我们看一下scipy.optimization文档我们可以看到scipy.optimize.minimize列在下面局部优化。 主要问题是你的问题是非凸的,因此scipy.optimize.minimize不能保证正确的收敛。由于它也是非常不可微的,因此许多算法根本不适合。

scipy.optimize确实提供了一些全局优化算法,尽管可以在下面的文档页面上找到全局优化,即basinhopping, brute, and differential_evolution。看着这个答案一些简短的解释。

基本上你可以尝试brute首先,只是看看是否存在任何系统性问题。这基本上是一个蛮力解决方案,速度会很慢,但要找到最小值。更复杂的方法是使用differential_evolution。由于你的功能并不是很顺利,basinhopping可能行不通,但它仍然值得一试,并且可能会收敛得最快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scipy.optimize.minimize 没有给出最小值,即使它看到该值 的相关文章

随机推荐