記事「ALGLIBライブラリの最適化手法(第2回):」についてのディスカッション - ページ 2

 

lbfgsメソッドを使用して、記事のスキン関数を検索します。




どのような千パラメータについて話しているのか理解できませんでした。そのような関数の例があれば、ぜひ教えてください。

 

どのSkinについて話しているのか分かりませんが、オリジナルのSkin test関数と他のいくつかの関数は、2010年にこのスレッドで @Andrey Dikによって 開発されました。これは面白い関数だが、単純なものだ。その後、彼はHilly、Forest、Megacityといった他のベンチマークを開発した。

2次元関数、さらには1次元関数のテストに関しては、ほとんどのAOが初歩的な問題を解くため、実用的な意味はないと前述したが、ランダム(超高速PRNGがある)を使った最も単純なアルゴでさえ、驚くほど高い結果を示し、高い効率とスピードがあるように錯覚させる。したがって、10次元以上の次元が検討される。次元を増やすには、1次元のベンチマークや2次元のベンチマークを複製して(得られた合計をテスト関数の数で割る)、テスト関数の最小値と最大値が次元に関係なく常にわかるようにする。これは次元数を増やしてもテスト関数の定義域を確実に知るための一般的な手法である。

等化」について。よし、等しくしよう、と思っても、彼らの気分は良くならない。ほとんどの母集団AOは、母集団サイズが50(10などもっと小さいものもあれば、100などもっと大きいものもある)でよいと感じる。FFの実行回数を10 000エポックに制限するとして、エポック=10 000 / 母集団サイズと考えると、10 000 / 50 = 200となる。したがって、空間上の初期位置を変えて勾配法を50回 実行し、その中から最適解を取り出すだけで、母集団をシミュレーションすることができる。それを何度か繰り返し、最適値の平均を計算する。こうすることで、完全な「条件の等しさ」が得られる。以前は1万回の反復で解を見つけるチャンスがあったのに、今は200回の反復 だが、50回の試行となる。

何が得られるか見てみよう。この記事のスクリプトをL-BGFS用に修正して母集団をシミュレートしてみよう。

int epochCount = NumbTestFuncRuns_P / PopSize_P;

  for (int test = 0; test < NumberRepetTest_P; test++)
  {
    double bestInPop = -DBL_MAX; // 母集団でベスト

    for (int p = 0; p < PopSize_P; p++)
    {
      for (int i = 0; i < funcCount; i++)
      {
        x [i * 2] = Ut.RNDfromCI (bndl [i * 2], bndu [i * 2]);
        x [i * 2 + 1] = Ut.RNDfromCI (bndl [i * 2 + 1], bndu [i * 2 + 1]);
      }

      //------------------------------------------------------------------------
      C_OptimizedFunction  fFunc; fFunc.Init (params, epochCount, PopSize_P, clrConv);
      CObject              obj;
      CNDimensional_Rep    frep;
      CMinLBFGSReportShell rep;

      double epsg = 1 e-16;
      double epsf = 1 e-16;

      CAlglib::MinLBFGSCreateF  (1, x, DiffStep_P, fFunc.state);
      CAlglib::MinLBFGSSetCond  (fFunc.state, epsg, epsf, ArgumentStep_P, epochCount);
      CAlglib::MinLBFGSSetScale (fFunc.state, s);
      CAlglib::MinLBFGSOptimize (fFunc.state, fFunc, frep, 0, obj);
      CAlglib::MinLBFGSResults  (fFunc.state, x, rep);
      //------------------------------------------------------------------------

      if (fFunc.fB > bestInPop) bestInPop = fFunc.fB;
    }

    aveResult += bestInPop;
  }

  aveResult /= NumberRepetTest_P;

結果は以下のようになる:

LBFGS|limited memory BFGS method for large scale optimization|0.9|
====================
5 Hilly's; Func runs: 10000; result: 0.52942166492675
25 Hilly's; Func runs: 10000; result: 0.30437018399902754
500 Hilly's; Func runs: 10000; result: 0.253457675831117
=======================
5 Forest's; Func runs: 10000; result: 0.46775770774270276
25 Forest's; Func runs: 10000; result: 0.20030246823425313
500 Forest's; Func runs: 10000; result: 0.15436391164477226
=================================
5 Megacity's; Func runs: 10000; result: 0.3046153846153846
25 Megacity's; Func runs: 10000; result: 0.13384615384615386
500 Megacity's; Func runs: 10000; result: 0.09492307692307773
=======================================
全スコア: 2.44306 (27.15%)

27.15%というのは、現在のランキングでは45位中42位くらい。

これで全員が同じ土俵に立ったことになる。

投稿に添付されているのは、このテストのスクリプトである。必要なものはすべて記事のアーカイブにある。

ファイル:
 
Maxim Dmitrievsky #:

lbfgs法を用いて、論文にある皮膚のph-iを検索する。

どのような千パラメータについて話しているのか理解できませんでした。もしそのような関数の例があれば教えてください。

記事と同じです。端末からの引用です。最も複雑な関数のひとつと書いてある。その後、とてもシンプルだと書いてある。

https://www.mql5.com/ru/forum/118887/page2#comment_3150124

どのサブ・パーソナリティを真に受ければいいのかわからない。

1000個のパラメータを持つ複雑な関数のコードはどこにありますか?

 
Maxim Dmitrievsky #:
記事と同じ。ターミナルから引用。最も複雑なものの一つと書いてある。その後、非常にシンプルだと書かれている

https:// www.mql5.com/ru/forum/118887/page2#comment_3150124

どのサブ・パーソナリティを真に受ければいいのかわからない。

1000個のパラメータを持つ複雑な関数のコードはどこにありますか?

Hillyは後から開発されたもので、Skinよりも複雑です。Skinは(Rastriginや他のほとんどの有名なもののように)単純なもののグループに属している。すべては記事に書いてある。

必要な出典はすべて記事のアーカイブにある。

どこに "非常に "単純だと書いてある?
 
Andrey Dik #:

Hillyは後から開発されたもので、Skinよりも複雑である。スキンは(ラストリギンや他の有名なもののように)単純なグループに属する。以上、記事にまとめてみた。

必要な出典はすべて記事のアーカイブにある。

私はpythonでチェックし、私はただ複雑な関数のコードが必要です。

MQLは取引の開始と終了のレベルでしか使っていない。
 
Maxim Dmitrievsky #:

複雑な関数のコードが必要です。

私はMQLを取引の開始と終了のレベルでしか使わない。

記事からHillyのコードを取り出し、チャットで実行すれば、それはpythonのコードになる。

あるいはMegacity、それはどのAOにとっても非常に複雑な関数だ。

 
Andrey Dik #:

記事からHillyのコードを取り出し、チャットで実行すると、pythonのコードになる。

あるいはMegacityは、どのAO機能にとっても非常に複雑だ。

C_dimentionalとかいう名前はどこで手に入るの? たくさんのパラメータを持つには

 
Maxim Dmitrievsky #:

C_dimentionalだかなんだか知らないけど、どこで手に入れたの? たくさんのパラメーターを持つためにね。

ここに新鮮な(記事にアーカイブされている)コア・テスト関数クラスがある:

double CalcFunc (double &args []) // 関数の引数
  {
    int numbOfFunctions = ArraySize (args) / 2;
    if (numbOfFunctions < 1) return GetMinFunValue ();

    double x, y;
    double sum = 0.0;
    for (int i = 0; i < numbOfFunctions; i++)
    {
      x = args [i * 2];
      y = args [i * 2 + 1];

      if (!MathIsValidNumber (x)) return GetMinFunValue ();
      if (!MathIsValidNumber (y)) return GetMinFunValue ();

      //double u = 0.5;
      //x = x * cos (u) - y * sin (u);
      //y = x * sin (u) + y * cos (u);

      if (x < GetMinRangeX ()) return GetMinFunValue ();
      if (x > GetMaxRangeX ()) return GetMinFunValue ();

      if (y < GetMinRangeY ()) return GetMinFunValue ();
      if (y > GetMaxRangeY ()) return GetMinFunValue ();

      sum += Core (x, y);
    }
    
    sum /= numbOfFunctions;

    return sum;
  }

多次元(つまり、配列の1次元にたくさんのセルがある、多次元空間)の任意の次元の配列をargsに投げるだけで、メソッドは配列から2次元関数に引数をばらまきます。奇数次元の配列を投げれば、1つのセルは捨てられ、計算に参加しないことは明らかである。つまり、これは偶数次元の多次元テスト関数である。

後日、1次元のものをベースにしてリリースする予定である。その方が実用的で、より明確にグラフを構築できるだろう。

コメントされたコードは、関数をある角度だけ回転させる機能である。これは多くのAOにとって頭の痛い問題である。まだどこにも使われていない。

 
アルゴリズムが問題を解決する時間をベンチマークに加えるのもいいだろう。私などはそもそも時間に興味がある。
 
Evgeniy Chernish #:
アルゴリズムが問題を解決する時間をベンチマークに加えるのもいいだろう。私などは、そもそもの時間に興味があります。
ありがとうございます。