6

これに関する Google の結果は、私が慣れ親しんでいるよりも高度な数学を必要とするようです (そして、私は 5 年生より賢くないかもしれませんが、調べるつもりはありません)。

行列や固有ベクトル、正規分布を掘り下げることなく、できれば c# で、多変量​​最適化問題を解決する一般的な方法を探しています。

数値変数xyzおよびwと、そのような関数fw = f(x, y, z)があるとします。wを最大化したいのですが...

  • f不明です
  • xyおよび/またはの間の相互依存性zは不明です。
  • 場合によっては、事後データセットしか持っていません
  • それ以外の場合は、変更xyて、オンデマンドzで再サンプリングできますw
  • アプリオリなケースでは、理想的なアルゴリズムは、 、およびwの試行順列を最小にして最大化し、サンプリングの各ラウンド後にそれぞれの次の値を選択します。xyz

独立変数の大まかな最小境界と最大境界があります。もちろん、必要以上に順列空間をサンプリングしたくありません。アルゴリズムには、少なくとも、最も明白x共依存関係を検出する大雑把な機能が必要です。たとえば、 >の場合の収穫逓減や、 、、およびの合計が上限を超える場合の2y実際の悪化などです。wxyz

私が調べた数学ライブラリのほとんどは、私がボイゲンフードル連続体で量子ナーゲンフリップ射影を実行する方法を知っていると想定していますが、私はそこにいません。数学者ではないコーダーはどのようにしてこれを達成するのでしょうか?

4

3 に答える 3

5

極小値にとらわれたくない場合は、シミュレーテッドアニーリングを試すことができます。

基本的に、いくつかのx、y、zから始めます。ゼロ平均分布(正規分布またはガウス分布)からランダムにdx、dy、およびdzを生成します。w(x + dx、y + dy、z + dz)> w(x、y、z)の場合、この新しいソリューションを選択します。それ以外の場合は、確率w(x + dx、y + dy、z + dz)/ w(x、y、z)を選択します。

Pythonコード

def simAnneal( w, seed_x, numSteps=100000, sigma=0.01 ):
    optimal_x = [i for i in seed_x]
    optimal_w = w(optimal_x)

    cur_w = w(seed_x)

    for i in range(numSteps):
        new_x = [i+random.gauss(0, sigma) for i in seed_x]
        new_w = w(new_x)

        if (new_w > cur_w) or (random.random() > new_w / cur_w) :
            cur_x = new_x
            cur_w = new_w
            if cur_w > optimal_w:
                optimal_w = cur_w
                optimal_x = cur_x
    return optimal_x
于 2012-05-17T00:08:39.907 に答える
3

f をサンプリングできれば、山登りができます。任意の位置 (x,y,z) から開始します。(x,y,z) および (x+delta,y,z) で f をサンプリングします。後者の方が優れている場合は、そこに移動します。そうでない場合は、より小さなデルタを試してください。また、負のデルタと他の 2 つの座標のデルタを試してください。デルタが f の増加をもたらさない場合、最大値に達しています。

これは、必ずしもグローバルな最大値ではなく、局所的な最大値のみを提供することに注意してください。デルタが小さすぎると、数値的にも非常に不安定になります。

f が x、y、z の低次多項式である場合など、f について何か知っていれば、はるかにうまく処理できます。次に、係数の最小二乗近似を実行し、導関数をゼロに設定して多項式を最大化できます。

于 2012-05-16T23:07:16.470 に答える
3

http://www.dotnumerics.com/NumericalLibraries/Optimization/Default.aspxから C# 用の Nelder-Mead Simplex 最適化アルゴリズムの実装を取得できるようです。この方法では、任意の点で最適化される関数を評価できるものを与えるだけです。導関数を必要とするメソッドほど効率的ではなく、実際、Torczon Simplex バリアントほど数学的に優れているわけではありませんが、人々はそれを使用しており、C# 用の無料の Torczon Simplex 実装を見つけることができません。

于 2012-05-17T05:10:15.533 に答える