ライブラリ: ALGLIB - 数値分析ライブラリ - ページ 4

 
Yury Kulikov:

美しいMQ!真面目な仕事だ!

ライブラリの使用例として、MLPニューラルネットワークに掛け算表を教えることができる。


:( ユーザーがエキスパートにライブラリを積極的に使い始めたら、クラウドに何が起こるのか考えるのが怖い。
このシンプルなスクリプトの重さは1メガバイト以下だ。


RFも同じ:

このスクリプトの精度はそれほど高くない。

#include <Math\Alglib\dataanalysis.mqh>
//+------------------------------------------------------------------+
#define _rand(min,max) ((rand()/(double)SHORT_MAX)*((max)-(min))+min)
//+------------------------------------------------------------------+
void OnStart()
{
   CDecisionForest      Trf;
   CDecisionForestShell RFshell;
   CMatrixDouble        PatternsMatrix;
   CDFReport            RF_report;
   int RFinfo;
   double vector[2], out[1];
   
   // データの準備
   PatternsMatrix.Resize(100,3);
   int m=0;     // 最初のパターン
   for(int i=1; i<=10; i++)
      for(int j=1; j<=10; j++)
      {
         PatternsMatrix[m].Set(0,i/10.0);       // 入力1
         PatternsMatrix[m].Set(1,j/10.0);       // 入力2
         PatternsMatrix[m].Set(2,(i*j)/100.0);  // ターゲット
         m++; //次のパターン
      }
   // RF作成。
   CDForest::DFBuildRandomDecisionForest(PatternsMatrix,100,2,1,50,0.4,RFinfo,Trf,RF_report);
   Print("Info=",RFinfo,"  Error=",CDForest::DFAvgError(Trf,PatternsMatrix,100));  
   // 整数データでネットワークをチェック
   string s=「テスト1 >> ";
   for(int i=1; i<=10; i++)
   {
      int d1=(int)_rand(1,10), d2=(int)_rand(1,10);
      vector[0]=d1/10.0;
      vector[1]=d2/10.0;
      CDForest::DFProcess(Trf,vector,out);
      s+=(string)d1+"*"+(string)d2+"="+DoubleToString(out[0]*100,0)+" // ";
   }
   Print(s);
   // 端数データでネットワークをチェック
   s=「テスト2 >> ";
   for(int i=1; i<=5; i++)
   {
      double d1=NormalizeDouble(_rand(1,10),1), d2=NormalizeDouble(_rand(1,10),1);
      vector[0]=d1/10.0;
      vector[1]=d2/10.0;
       CDForest::DFProcess(Trf,vector,out);
      s+=DoubleToString(d1,1)+"*"+DoubleToString(d2,1)+"="+DoubleToString(out[0]*100,2)+
         "("+DoubleToString(d1*d2,2)+") // ";
   }
   Print(s);
}
2017.09.04 21:43:21.609 RF sample (EURUSD,H1)   Info=1  Error=0.01861400000000001
2017.09.04 21:43:21.610 RF sample (EURUSD,H1)   Тест 1 >> 6*9=55 // 7*3=21 // 6*6=38 // 9*7=65 // 9*9=80 // 8*4=32 // 4*1=6 // 1*8=13 // 4*3=12 // 2*2=5 // 
2017.09.04 21:43:21.610 RF sample (EURUSD,H1)   Тест 2 >> 7.7*5.8=46.64(44.66) // 3.0*3.3=9.70(9.90) // 6.0*9.2=55.32(55.20) // 2.6*6.7=20.08(17.42) // 2.5*4.0=12.54(10.00) // 

追記

CDForest::DFBuildRandomDecisionForest(PatternsMatrix,100,2,1,500,1,RFinfo,Trf,RF_report);

このスクリプトは、より正確で、500古代とr=1、よりフィットし、ノイズが少ない。

2017.09.04 22:08:33.227 RF sample (EURUSD,H1)   Info=1  Error=2.02997341158806 e-15
2017.09.04 22:08:33.228 RF sample (EURUSD,H1)   Тест 1 >> 2*2=4 // 2*6=12 // 1*9=9 // 9*1=9 // 4*7=28 // 9*6=54 // 5*6=30 // 5*5=25 // 4*1=4 // 1*4=4 // 
2017.09.04 22:08:33.230 RF sample (EURUSD,H1)   Тест 2 >> 4.0*3.8=16.00(15.20) // 9.6*3.1=30.00(29.76) // 5.5*6.4=36.00(35.20) // 4.0*4.4=16.00(17.60) // 1.6*4.2=8.00(6.72) // 
 
Maxim Dmitrievsky:


RFも同じだ:

精度が低いと考えている。

追記

この方法はより正確で、500本の木とr=1、よりフィットし、ノイズが少ない。

結果を正確にするためには、何本の木を作る必要があるのだろうか?そして、それは最も単純な乗算表であり、いくつかの関数がある場合、我々は乗算表ではなく、RFを介して実行する必要があり、その答えは明らかに遠くから公正な何かに似ているでしょう?
 
MQL5ライブラリーは実に強力で、ライブラリーの呼び出し方を詳しく説明します。
 

取引、自動取引システム、取引戦略のテストに関するフォーラム

エラー、バグ、質問

Andrey Khatimlianskii, 2019.01.30 04:57 AM

MQL5Include\Math\AlgLib\dataanalysis.mqh - CLinReg::LRLine does not work for 1M and more values?

どなたかご存知ですか?

 

ありがとう、ラシッド・ウマロフ

このスレッドは3年間更新され続けているが、ウェブサイトは更新され続けている。

 

私たちはALGLIBライブラリのGPL C++ベースのバージョン の完全なオーバーホールを行い、ALGLIB++としてリリースしました。これはALGLIBの最新バージョンを追跡するもので、2019/12現在3.16.0です。MQL5が同期している以前のバージョンから、最適化モジュールと補間モジュールに多くのことが追加されています(例えば、点群スプライン(!)、より多くの逆距離加重補間法、多数の追加最適化法など)。

ALGLIB++は、より長期的なリエンジニアリング/リファクタリングプロセスの中間形態として使用されているALGLIBの派生バージョンです。(バージョン3以前と同様に)ネイティブC++に再コード化され、マルチスレッドをより直接的にサポートし、追加のテストやモジュール、最終的にはスクリプト言語のフロントエンドを提供する準備として、余分なレイヤーや重複が取り除かれます。

ALGLIBの異なる言語バージョンはすべて共通のコアから生成され、C++バージョンはCのC90方言の限定的な(しかし非公式な)サポートを提供します。この機能により、C++にネイティブな機能をCの中でシミュレートし、その上にC++ラッパーを提供する必要がありました。これに対応して、Cバージョンを含むalglib_implと、C++ラッパーを含むalglibという2つの別々の名前空間が存在する。ALGLIB++は、この構造の大部分と元のコーディングを可能な限り保持していますが、マルチスレッドのネイティブC++コードに置き換えるための第一歩として、グローバル・インフラストラクチャの大部分を削減または削除し、C++ラッパー・インターフェースを大幅に簡素化しています。そのため、ALGLIBそのものと、ALGLIB++が変貌を遂げつつある将来のライブラリとの橋渡しをする中間的な形態となっています。


MQL5によって適応されたバージョン以降(およびそれ以前)のALGLIBの複雑さの増大につながる多くの問題は解決され、その結果、構造が単純化され、複雑さが軽減されました。現在の形では、現在ALGLIBのMQL5バージョンを保守している人々によって、MQL5への適応がより簡単であることが証明されるはずです。

ALGLIB C++のマニュアルからALGLIB++のマニュアルに完全に書式を変更しました。しかし、パッケージとサブパッケージのセクションは両方のバージョンのALGLIBと互換性があり、レイアウトと内容はMQL5バージョンに簡単に適応できるはずです。MQL5はマニュアルの "参考文献と関連リンク "のセクションで紹介されています。


最新バージョンは将来の ALGLIB++への統合に向けて、 LAPACKのC++翻訳版(LAPACK++と呼ぶ予定)も準備中です。MKL(ちなみにニューラルネット・ルーチンを備えている)を含む他のライブラリも、将来の統合に向けて検討中である。

LydiaMarieWilliamson/ALGLIB_cpp
LydiaMarieWilliamson/ALGLIB_cpp
  • LydiaMarieWilliamson
  • github.com
Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up Permalink
 
MQL5版ALGLIBの開発者の方々への補足です:

ALGLIBをMQL5に適応させたとき、"RCOMM "ルーチンで問題にぶつかりました。

これらは事実上マルチスレッド化されたルーチンで、スレッド切り替えは以下の方法で直接コードに記述されています:
(1)各入出力でスレッドローカル変数をキャッシュし、反復ルーチンは潜在的に数百万、数十億のコール/リターンサイクルを実行する!
(2)イベント発生時にルーチンから飛び出して "一時停止 "し、イベント発生後にルーチンに戻って "再開 "することで、スレッド切り替えを実装する。
(3)エントリーポイントを関数本体のトップレベルに置くために、ルーチンの制御フロー構造を縮小する。

ALGLIBをMQL5に適応させるとき、あなたは制御フロー構造をそのままにして、コード・スニペットを別々のルーチンに分離しました。ALGLIBのアップデートを維持することは不可能になりました。RCOMMルーチンは時々、以前のバージョンの構造体や変数を残してしまいます。

ALGLIB++では、制御フロー構造は再統合され、エントリーポイントは、ループや他の制御フロー構造の途中でジャンプし、そこで終了します。
スレッドローカル変数のキャッシュはありません。(スレッドセーフティは犠牲になっていますが、マルチスレッドは正式にはGPL ALGLIBの一部ではありません。)
ALGLIBのように、これはすべてのジャンプを行ったり来たりするために多くのgoto文があることを意味しますが、よりきれいに整理されています。
ALGLIB++で行われる修復は、我々のテスト結果に よると、それ自体でルーチンを約20-25%高速化する。

gotoステートメントを取り除き、スレッドローカル変数をより適切に扱うために、このアーキテクチャに対処する方法は2つある:
(1) 実際のスレッドスイッチングを実装する。つまり、RCOMMルーチンが「イベント」メッセージを送信し(needf、...algpowerupフラグが実際のものである)、呼び出し側はメッセージを受信して処理するイベントハンドラをセットアップしなければならない。ただし、MQL5がユーザー定義イベントを生成して処理できるかどうかはわかりません。
(2) イベントに関数ポインタを使用する。
RCOMMルーチンはネストされている可能性があり、場合によっては、RCOMMルーチン自身が呼び出したRCOMMルーチンから取得したイベントを呼び出し元へリレーすることがあります。

ALGLIBの開発者は、ALGLIBの実装時に関数ポインタやマルチスレッドを使用しないことを決定しました。なぜなら、ALGLIBが最初にリリースされたとき、広く配布され、広く使用されている言語にはマルチスレッドプログラミングの正式なサポートがなく、ALGLIBがターゲットとしたすべての言語がCやC++の関数ポインタと同じか類似のものを持っていたわけではなかったからです。しかしMQL5には関数ポインタがある。ALGLIBをMQL5に適応させる場合、制御フロー構造が再統合されているため、代わりにALGLIB++から行う方がはるかに簡単でしょう。

しかし、理想的な解決策は、スレッドスイッチングを使用することです。最終的には、ALGLIB++では関数ポインタかスレッドスイッチングのどちらかが使われることになるでしょう。

 
LydiaMW:
ALGLIBのMQL5バージョンの開発者への補足事項:

ALGLIBをMQL5に適応させたとき、"RCOMM "ルーチンで問題にぶつかりました。

これらは事実上マルチスレッド化されたルーチンで、スレッド切り替えが直接コードに書かれています:
(1)各入出力でスレッドローカル変数をキャッシュし、反復ルーチンは潜在的に数百万、数十億のコール/リターンサイクルを実行する!
(2)イベント発生時にルーチンから飛び出して "一時停止 "し、イベント発生後にルーチンに戻って "再開 "することで、スレッド切り替えを実装する。
(3)関数本体のトップ・レベルにエントリー・ポイントを置くために、ルーチンのコントロール・フロー構造を縮小する。

ALGLIBをMQL5に適応させるとき、あなたは制御フロー構造をそのままにして、コード・スニペットを別々のルーチンに分離しました。ALGLIBのアップデートを維持することは不可能になりました。彼らのRCOMMルーチンは時々、以前のバージョンからの構造体や変数を残している。

ALGLIB++では、制御フロー構造が再統合され、エントリーポイントは、ループや他の制御フロー構造の途中でジャンプして、元の場所に戻ります。
スレッドローカル変数のキャッシュはありません。(スレッド安全性を犠牲にしていますが、マルチスレッドは正式にはGPL ALGLIBの一部ではありません。)
ALGLIBのように、これはすべてのジャンプを行ったり来たりするために多くのgoto文があることを意味しますが、よりきれいに整理されています。
ALGLIB++で行われた修正は、我々のテスト結果に よると、それ自体でルーチンを約20-25%高速化する。

goto文を取り除き、スレッドローカル変数をより適切に扱うために、このアーキテクチャに対処する方法が2つある:
(1) 実際のスレッドスイッチングを実装する。つまり、RCOMMルーチンが「イベント」メッセージを送信し(needf、...algpowerupフラグが実際のものである)、呼び出し側はメッセージを受信して処理するイベントハンドラをセットアップしなければならない。ただし、MQL5がユーザー定義イベントを生成して処理できるかどうかはわからない。
(2) イベントに関数ポインタを使用する。
RCOMMルーチンはネストされている可能性があり、場合によっては、RCOMMルーチン自身が呼び出したRCOMMルーチンから取得したイベントを呼び出し元へリレーすることがあります。

ALGLIBの開発者は、ALGLIBの実装時に関数ポインタやマルチスレッドを使用しないことを決定しました。なぜなら、ALGLIBが最初にリリースされたとき、広く配布され、広く使用されている言語にはマルチスレッドプログラミングの正式なサポートがなく、ALGLIBがターゲットとしたすべての言語がCやC++の関数ポインタと同じか類似のものを持っていたわけではなかったからです。しかしMQL5には関数ポインタがある。ALGLIBをMQL5に適応させる場合、制御フロー構造が再統合されているため、代わりにALGLIB++から行う方がはるかに簡単でしょう。

しかし、理想的な解決策は、スレッドスイッチングを使用することです。最終的には、ALGLIB++では関数ポインタかスレッドスイッチングのどちらかが使われることになるでしょう。

Lydiaへ

しかし、githubにあるALGLIB ++のライブラリファイルはまだC ++ CPP形式です。MQL5 mqlに変換されていません。ALGLIB ++のライブラリファイルを.mqlとして提供していただけますか?ありがとうございます

 

開発者の皆さん、 複素数の 共役数を 計算するメソッドを 複素数 構造に追加してください ( ソースは SB <MathAlglib\complex.mqh> にあります)

私のバージョン

   //--- オペレーション
   void              Copy(const complex &rhs);
   bool              Eq(const complex &lhs, const complex &rhs);
   bool              NotEq(const complex &lhs, const complex &rhs);
   complex           Add(const complex &lhs, const complex &rhs);
   complex           Sub(const complex &lhs, const complex &rhs);
   complex           Mul(const complex &lhs, const complex &rhs);
   complex           Div(const complex &lhs, const complex &rhs);
   complex           Conjugate(void) const;


................


//+------------------------------------------------------------------+
//| 共役|
//+------------------------------------------------------------------+
complex complex::Conjugate(void) const
  {
   complex complex_val(re,-im);
   return complex_val;
  };


新しいビルドの 次のリリースの後、前のリビジョンに ロールバックしなければならない。これは不便だ。

 
Denis Kirichenko:

開発者の皆様、 複素数の 共役数を 計算するメソッドを 複素数 構造に追加してください ソースはSB <MathAlglib\complex.mqh>に あります

私のバージョン


新しいビルドの 次のリリースの後、前のリビジョンに ロールバックしなければならない。これは不便だ。

追加