編集:これはここですでに回答されているようです
正しい命名法を知らなかったため、検索に表示されませんでした。制約のために誰かがここに到着した場合に備えて、ここで質問を残しておきます。
ほとんどすべてのポイントでフラットな関数を最適化しようとしています(「ステップ関数」ですが、より高い次元にあります)。
目的は、合計が 1 になる必要がある一連の重みを最適化することであり、最小化する必要がある関数のパラメーターです。
問題は、関数がほとんどの点でフラットであるため、勾配法は最初の「推測」にすぐに収束するため失敗することです。
私の仮説は、これは (a) アニーリングまたは (b) 遺伝的アルゴリズムで解決できるというものです。Scipy は私をbasinhoppingに送ります。ただし、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)