1

編集:これはここですでに回答されているようです

正しい命名法を知らなかったため、検索に表示されませんでした。制約のために誰かがここに到着した場合に備えて、ここで質問を残しておきます。


ほとんどすべてのポイントでフラットな関数を最適化しようとしています(「ステップ関数」ですが、より高い次元にあります)。

目的は、合計が 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)
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 に答える