1

私は、最も急勾配の適切な方法を使用して、離散化された関数を最小化しようとしています。これはかなり簡単なはずですが、ローカル最小値からの検索「クライミング」に問題があります。これがMathematicaの私のコードですが、その構文は簡単に理解できます。

x = {some ordered pair as a beginning search point};
h = 0.0000001; (* something rather small *)
lambda = 1;
While[infiniteloop == True,
  x1 = x[[1]];
  x2 = x[[2]];
  x1Gradient = (f[x1-h,x2]-f[x1+h,x2])/(2h);
  x2Gradient = (f[x1,x2-h]-f[x1,x2+h])/(2h);
  gradient = {x1Gradient,x2Gradient};

  (* test if minimum is found by normalizing the gradient*)
  If[Sqrt[x1Gradient^2 + x2Gradient^2] > 0.000001,
    xNew = x + lambda*g,
    Break[];
  ];

  (* either pass xNew or reduce lambda *)
  If[f[xNew[[1]],xNew[[2]]] < f[x1,x],
    x = xNew,
    lambda = lambda/2;
  ];
];

なぜこれが丘を登るのですか?新しい値が古い値よりも小さいかどうかをテストすることさえあるので、私は困惑しています。そして、私はそれがそうであるときにそれを渡しません!考え?

4

3 に答える 3

3

制約のない最適化チュートリアル、p.4 から: ( http://www.wolfram.com/learningcenter/tutorialcollection/で入手可能)

「最急降下は確かに局所最小化の可能な戦略ですが、多くの場合、すぐに収束しません。この例の後続のステップで、検索方向が等高線に対して正確に垂直ではないことに気付くかもしれません。検索は過去のステップからの情報を使用しています。関数の曲率に関する情報を取得しようとする. 通常はより良い方向性を与える. 別の戦略は, 通常より速く収束するが, より高価になる可能性がある. 関数の二次導関数を使用することである. これは通常、ニュートンの「方法」として。

私には、「間違った方向に進む」ことは、アルゴリズムが「正しい方向に進む」ことを学習するのに役立ち、関数の曲率に関する有用な情報を提供して、後続のステップを導くという考えのようです。

HTH...そうでない場合は、制約付きおよび制約なしのチュートリアルをご覧ください。興味深い情報がたくさん。

于 2011-07-06T06:27:42.160 に答える
2

あなたの勾配は負です。使用する

 x1Gradient = (f[x1+h,x2]-f[x1-h,x2])/(2h);
 x2Gradient = (f[x1,x2+h]-f[x1,x2-h])/(2h);
于 2011-07-06T08:13:02.890 に答える
1

最急降下が局所最適でスタックするため、タブー検索の側面を有効にして、局所最適でスタックしないようにします。

最急上昇 (= 最急降下) とタブー検索のアルゴリズムの例については、この本を参照してください。

于 2011-07-06T09:57:14.103 に答える