Scipy在自由及固定参数函数上进行盆地跳跃最小化

3 投票
1 回答
4403 浏览
提问于 2025-04-18 18:11

我有一个函数,它的输入是一个包含可调参数的元组和一个包含固定参数的元组,输出是一个标量值。这个函数运行起来比较耗时,我想在不知道任何梯度或海森矩阵的情况下找到这个函数的最小值。为此,我决定使用“盆地跳跃”方法,并选择COBYLA作为最小化函数,因为在一次测试中,这种方法在处理一个简单函数时调用次数最少,并且可以使用边界限制。

不过,我不太清楚如何告诉“盆地跳跃”方法哪些参数是可以优化的,哪些是固定的。

def func(x_free, x_fixed):
    '''Do some expensive stuff here'''
    global FUNC_CALLS
    FUNC_CALLS += 1
    return scalar_value

在文档中,我看到可以通过一个叫做minimizer_kwargs的字典来传递参数给这个函数。但是,文档没有解释我应该使用哪些关键词。有没有人能帮我列出minimizer_kwargs允许的关键词,以及它们的作用?

如果没有x_fixed这个参数,我的代码看起来是这样的:

from scipy.optimize._basinhopping import basinhopping
global FUNC_CALLS
FUNC_CALLS = 0
x0 = (1.0, 0.0, 0.0)
minimizer_kwargs = {"method": "COBYLA"}
ret = basinhopping(func, x0, minimizer_kwargs=minimizer_kwargs, niter=10)
print("Global minimum: x = [%.4f, %.4f, %.4f], f(x0) = %.4f" % (ret.x[0], ret.x[1], ret.x[2], ret.fun))
print("Number of function calls: {0}".format(FUNC_CALLS))

简单来说:我该怎么做才能把x_fixed放进这个函数里呢?

1 个回答

4

根据basinhopping的文档说明,您需要在minimizer_kwargs中添加一个args键,并将其值设置为(x_fixed,)

比如:

minimizer_kwargs = {"method": "COBYLA", "args": (x_fixed,)}

撰写回答