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

时间:2019-05-13 05:38:17

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

我正在使用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的最小值?

1 个答案:

答案 0 :(得分:2)

如果我们看一下scipy.optimization文档,就会发现scipy.optimize.minimize列在本地优化下。 主要问题是您的问题是非凸的,因此scipy.optimize.minimize无法保证适当的收敛。由于它也是不可微的,因此许多算法根本不适用。

scipy.optimize确实提供了一些全局优化算法,尽管可以在文档页面上的全局优化下找到它们,即basinhoppingbrute和{{ 1}}。请查看this answer进行简短说明。

基本上,您可以首先尝试differential_evolution,以查看是否存在系统性问题。基本上,这是一种蛮力解决方案,会很慢,但要找到最低限度。更复杂的方法是使用brute。由于您的功能并不是很流畅,因此differential_evolution可能无法正常工作,但是仍然值得一试,并且收敛速度最快。