我在编写basinhopping
中的参数边界时遇到了困难。
(x0)=(a, b, c )
a = (0, 100)
b = (0, 0.100)
c = (0, 10)
from scipy.optimize import basinhopping
minimizer_kwargs = { "method": "Nelder-Mead" }
min = basinhopping(rmse, x0, minimizer_kwargs=minimizer_kwargs, T=0.5, stepsize=0.1, niter=200, disp=True)
3条答案
按热度按时间ws51t4hk1#
有多种方法可以解决这个问题,每种方法的表现都可能不同(在非凸全局优化中很常见)。最好的方法总是考虑关于优化问题的先验信息!
最稳健的一般方法(在我看来也是最好的方法)是以下方法的组合:
***A:**内层:有界约束局部搜索
***B:**外部级别:有界约束步骤
这个优化器的原作者说,只依赖于A(就像现在在其他两个答案中所做的那样)might fail!
编码:
输出量:
ttygqcqt2#
您应该在
minimizer_kwargs
中使用"bounds"
参数,该参数将传递给scipy.optimize.minimize()
。以下是一个示例:其结果是
全局最小值:a = 1.0000,B = 1.0000,c = 1.0000| f(x0)= 3.0000
没有边界它是(清晰的)0,0,0
e4eetjau3#
我知道这个问题是旧的(公认的答案是从大约5年前),我希望我可以评论它,而不是提供一个新的“答案”(我缺乏这样做的声誉,不幸的是),但我想要求一些澄清的公认答案提供的@sascha 11月1日,2017.
具体地说,通过查看
class RandomDisplacementBounds(object)
的函数__call__
的代码,我不明白为什么 x_new 被定义为xnew = x + random_step
而不是简单地定义为xnew = random_step
。我的推理是,如果传递给函数
__init__
的xmin
和xmax
确实是向量 x 的上界和下界,并且random_step
是从xmin
和xmax
之间的均匀分布中随机抽取的点,那么所谓的random_step
就是本地优化例程的新点。这是真的吗?我将非常感谢任何关于这方面的帮助。