5

MATLAB と Octave の 2 つの関数の間で、単純な最適化問題に対して一貫した答えを得ようとしています。これが私のコードです:

  options = optimset('MaxIter', 500 , 'Display', 'iter', 'MaxFunEvals', 1000);

  objFunc = @(t) lrCostFunction(t,X,y);

  [result1] = fminsearch(objFunc, theta, options);
  [result2]=  fmincg (objFunc, theta, options);

(X、y、およびシータは以前に定義されており、正しいことに注意してください)。問題は次のとおりです。上記のコードを MATLAB で fmincg (fminsearch を推奨) を使用して実行すると、正しい答えが得られます。

ただし、fmincg をコメントアウトして fminsearch を実行すると、変換はまったく行われません。実際、出力は次のようになります。

   491          893         0.692991         reflect
   492          894         0.692991         reflect
   493          895         0.692991         reflect
   494          896         0.692991         reflect
   495          897         0.692991         reflect
   496          898         0.692991         reflect
   497          899         0.692991         reflect
   498          900         0.692991         reflect
   499          901         0.692991         reflect
   500          902         0.692991         reflect



Exiting: Maximum number of iterations has been exceeded
         - increase MaxIter option.
         Current function value: 0.692991 

反復回数を増やしてもジャックにはなりません。対照的に、fmincg を使用すると、収束し、最終的に正しい結果が得られます。

Iteration     1 | Cost: 2.802128e-001
Iteration     2 | Cost: 9.454389e-002
Iteration     3 | Cost: 5.704641e-002
Iteration     4 | Cost: 4.688190e-002
Iteration     5 | Cost: 3.759021e-002
Iteration     6 | Cost: 3.522008e-002
Iteration     7 | Cost: 3.234531e-002
Iteration     8 | Cost: 3.145034e-002
Iteration     9 | Cost: 3.008919e-002
Iteration    10 | Cost: 2.994639e-002
Iteration    11 | Cost: 2.678528e-002
Iteration    12 | Cost: 2.660323e-002
Iteration    13 | Cost: 2.493301e-002

.
.
.


Iteration   493 | Cost: 1.311466e-002
Iteration   494 | Cost: 1.311466e-002
Iteration   495 | Cost: 1.311466e-002
Iteration   496 | Cost: 1.311466e-002
Iteration   497 | Cost: 1.311466e-002
Iteration   498 | Cost: 1.311466e-002
Iteration   499 | Cost: 1.311466e-002
Iteration   500 | Cost: 1.311466e-002

これにより、正しい回答が得られます。

それで、何が得られますか?この最小化のケースで fminsearch が機能しないのはなぜですか?

追加のコンテキスト:

1) Octave は fmincg btw を持つ言語ですが、Google の簡単な結果でもこの関数が取得されます。私の MATLAB はどちらかを呼び出すことができます。

2) 私の問題には凸状の誤差曲面があり、その誤差曲面はどこでも微分可能です。

3)私はfminsearch、fminbnd(この問題は単変量ではなく多変量であるため使用できません)にしかアクセスできないため、fminsearchが残ります。ありがとう!

4

2 に答える 2

6

fmincg は共役勾配型の最適化を実装していると思います。fminsearch は導関数を使用しない最適化手法です。では、なぜ同じ結果が得られると期待するのでしょうか。それらは完全に異なるアルゴリズムです。

fminsearch が凸コスト関数の大域的最小値を見つけることを期待します。少なくとも、これはこれまでの私の経験です。

fminsearch の出力の最初の行は、objFunc(theta) が ~0.69 であることを示唆していますが、この値は fmincg の出力のコスト値とは大きく異なります。そのため、fminsearch 以外で考えられるバグを探します。両方のアルゴリズムに同じコスト関数と初期点を指定していることを確認してください。

于 2012-05-27T01:10:35.343 に答える
1

これは、このアルゴリズムで時々気付いた問題です。それはあなたが探している答えではないかもしれませんが、これらの場合、私にとってうまくいくように見えるのは、それが終了する許容値を変更することです。私が見ているのは、等しい結果を提供する2点間の振動です。私はこれがLabViewで発生することを知っており、Matlabで発生すると推測することしかできません。

あなたのデータを見ない限り、これ以上コメントすることはできませんが、それが私が提案することです。

注:許容値を大きくすることで、アルゴリズムがその状態に達する前にアルゴリズムをキャッチすることが目標になります。精度は低くなりますが、通常、有効桁数はかなり少なくなります。

于 2012-05-27T02:24:18.703 に答える