如何在不使用梯度以及使用约束和范围的情况下最小化 Python 中的函数



编辑:看起来这在之前已经回答了

它没有出现在我的搜索中,因为我不知道正确的命名法。我将暂时将问题留在这里,以防有人因为限制而到达这里。


我正在尝试优化一个几乎在所有点上都是平坦的函数("步长函数",但在更高的维度上(。

目标是优化一组权重,这些权重的总和必须为 1,并且是我需要最小化的函数的参数。

问题在于,由于函数在大多数点上是平坦的,梯度技术失败了,因为它们立即收敛于开始的"猜测"。

我的假设是,这可以通过(a(退火或(b(遗传算法来解决。西皮送我去跳盆。但是,我找不到任何方法来使用 scipy 使用约束(权重总和必须为 1(或范围(权重必须在 0 和 1 之间(。

实际问题:如何在没有梯度的情况下解决最小化问题,并对输入变量使用约束和范围?


下面是一个玩具示例(显然这个可以使用渐变来解决(:

# import minimize 
from scipy.optimize import minimize
# define a toy function to minimize 
def my_small_func(g): 
    x = g[0]
    y = g[1]
    return x**2 - 2*y + 1
# define the starting guess 
start_guess = [.5,.5]
# define the acceptable ranges (for [g1, g2] repectively)
my_ranges = ((0,1),(0,1))
# define the constraint (they must always sum to 1)
def constraint(g): 
    return g[0] + g[1] - 1 
cons = {'type':'eq', 'fun': constraint}
# minimize 
minimize(my_small_func, x0=start_guess, method='SLSQP',
         bounds=rranges, constraints=cons)

我通常使用,所以也许这是一个糟糕的答案,但无论如何,这里。

您可以像使用全局优化器一样解决优化问题。这方面的一个例子是差分进化。链接方法不使用渐变。至于约束,我通常是手动构建的。它看起来像这样:

    # some dummy function to minimize
    def objective.function(a, b)
      if a + b != 1 # if some constraint is not met
        # return a very high value, indicating a very bad fit
        return(10^90)
      else 
        # do actual stuff of interest
        return(fit.value)

然后,您只需将此函数馈送到差分进化包函数,这应该就可以了。像差分进化这样的方法专门用于解决非常高维的问题。但是,您提到的约束可能是一个问题,因为它可能会导致非常多的无效参数配置。这对算法来说不一定是问题,而只是意味着您需要进行大量调整并需要等待大量等待时间。根据您的问题,您可以尝试优化块中的权重/参数。这意味着,在给定一组权重的情况下优化参数,然后在给定前一组参数的情况下优化权重并重复多次。

希望这对:)有所帮助

最新更新