【发布时间】: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
Bounds与Constraints不同,这就是为什么在Scipy中您可以单独定义它们。我建议尝试使用不同的method,看看行为是否有变化。 -
是的,
Bounds与Constraints不同。 stackoverflow.com/questions/19244527/…关注这个问题的答案。 -
我认为该函数不是凸函数,因此如果局部最小值也是全局的,那只是运气,在这种情况下,您可以尝试多次随机初始化并希望... :)
标签: python optimization scipy scipy-optimize scipy-optimize-minimize