Scipy.optimize.minimize 没有给出最小值,即使它看到该值
Scipy.optimize.minimize is not giving the minimum value even though it sees that value
我正在使用 scipy.optimize.minimize 为我的 objective 函数寻找最佳参数。
我的代码:
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 仍作为最小值返回。
objective 函数多次达到 -21 的值,但为什么仍然返回 -7 作为最小值?
如果我们查看 scipy.optimization
文档,我们可以看到 scipy.optimize.minimize
列在 local optimization 下。
主要问题是你的问题是 non-convex 因此 scipy.optimize.minimize
不能保证正确收敛。由于它也非常non-differentiable,很多算法根本不适合
scipy.optimize
确实提供了一些全局优化算法,尽管可以在全局优化 下的文档页面上找到,即 basinhopping
、brute
,以及 differential_evolution
。查看 this answer 以获得一些简短的解释。
基本上可以先试试brute
,看看有没有系统问题。它基本上是一个蛮力解决方案并且会很慢,但找到你的最小值。更复杂的方法是使用 differential_evolution
。由于您的函数不是很流畅,basinhopping
可能无法正常工作,但它仍然值得一试,并且可能收敛最快。
我正在使用 scipy.optimize.minimize 为我的 objective 函数寻找最佳参数。
我的代码:
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 仍作为最小值返回。
objective 函数多次达到 -21 的值,但为什么仍然返回 -7 作为最小值?
如果我们查看 scipy.optimization
文档,我们可以看到 scipy.optimize.minimize
列在 local optimization 下。
主要问题是你的问题是 non-convex 因此 scipy.optimize.minimize
不能保证正确收敛。由于它也非常non-differentiable,很多算法根本不适合
scipy.optimize
确实提供了一些全局优化算法,尽管可以在全局优化 下的文档页面上找到,即 basinhopping
、brute
,以及 differential_evolution
。查看 this answer 以获得一些简短的解释。
基本上可以先试试brute
,看看有没有系统问题。它基本上是一个蛮力解决方案并且会很慢,但找到你的最小值。更复杂的方法是使用 differential_evolution
。由于您的函数不是很流畅,basinhopping
可能无法正常工作,但它仍然值得一试,并且可能收敛最快。