1

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

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


我正在尝试优化一个几乎在所有点上都是平坦的函数(“阶梯函数”,但维度更高)。

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

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

我的假设是,这可以通过(a)退火或(b)遗传算法来解决。Scipy 把我送到盆地跳跃。但是,我找不到任何方法来使用 scipy.

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


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

# 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)
4

1 回答 1

1

我通常使用 R,所以这可能是一个糟糕的答案,但无论如何都可以。

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

    # 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)

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

希望这可以帮助 :)

于 2016-02-14T14:12:48.877 回答