記事"R で 統計分布を MQL5 に -"についてのディスカッション - ページ 13

 
СанСаныч Фоменко:

読む。

読み込んだ。

私は、あなたが行ったテストはまったく正しくないと思う。性能の比較が最後ではないので、私はそれを書く必要があると考えている。

重要なのは、MKLはRとは質的に違うということだ。そして性能比較の場合、可能な限りこれらの質的な違いを考慮に入れるべきです。Rはインタプリタであり、MKLはコンパイラである。産業用プログラムでは、この質的な違いがMKLに有利に働く。

Rのソースコードを見てみよう(オープンソースのコードである)。そこでは、C/C++の基本的な数学はすべてエンジンにコンパイルされている。また、ほとんどのパッケージもC++で書かれており、そうでなければ計算結果を待つことができない。

もしRが基本/システム関数のインタプリタだったら、MQL5に200-500倍遅れをとるだろう。私たちは特に、RのシステムC/C++関数をテストしたのであって、(Rが何百倍も遅れをとる)ループでの手動処理を構築したわけではない。

Rの開発では、「どうすればfor/while/foreachループを書かなくて済むパッケージを見つけられるか」を常に探している。実際、Rで計算を行う方法は1つしかなく、それは多かれ少なかれ膨大な計算をサードパーティーのパッケージに渡すことだ。


しかし、もう1つの質的な違いがあり、これはプログラムの工業的な運用においても非常に重要であり、テストではこれらの違いが考慮されなかったため、結果が歪んでしまった。

RとMKLの質的な違いは、MKLの基本オブジェクトはスカラーで あり、ベクトルなどのより複雑なオブジェクトはスカラーから構成されるということである。分布関数の入力に与えられるのはベクトルである。

include/math/statカタログには何百ものベクトル関数がある。


Rではスカラーという概念はまったくない。最も単純なオブジェクトはベクトルである。Rはこの事実を広範に利用しており、Rのコードで分布関数を比較する例では、MKLでは利用できない「ベクトル化」というR特有のプログラミング技法をはっきりと見ることができます。これは計算を10倍から100倍(行列の大きさによる)高速化するR特有のテクニックなので、Rのコードにはこのテクニックが含まれていなければならない。ベクトル化の使用は明らかで、テストでは入力ベクトルを受け取り、それに対して100回計算を実行する。

Rにはベクトル化も現代的な機能もない。そこにあるコードは、普通のプログラミングのジュニアが真正面から書いているだけだ。確かに彼らはまともな数学者だが、平凡なプログラマーだ。

RにおけるGPUは、おとぎ話や、希少なパッケージにおける孤立した試みでしかない。


要約すると、Rで書かれた文章は、Rの機能を使ってRで書かれるべきである。

あなたはRもMQL5も知らない。

Rのソースを見ていないし、MQL5のソースも知らない。あなたは過去15年間コンパイラを作ったことがない。しかし、あなたはそれをすべてやってきた人たちと議論しようとしている。

 

現在、MQL5の統計ライブラリ(Alglib、Fuzzyを除く)にはすでに461以上の関数がある:https://www.mql5.com/ru/forum/86386/page222#comment_3867386。

これはすでに基本的な統計関数を十分にカバーしている。


もし以前にこの記事を読んだことがあるのであれば、もう一度読んでみることをお勧めする。昨日、多くの新しい関数が追加された新バージョンがリリースされた。
Машинное обучение: теория и практика (торговля и не только)
Машинное обучение: теория и практика (торговля и не только)
  • www.mql5.com
Добрый день всем, Знаю, что есть на форуме энтузиасты machine learning и статистики...
 
Renat Fatkhullin:

現在、MQL5の統計ライブラリ(Alglib、Fuzzyを除く)にはすでに461以上の関数がある:https://www.mql5.com/ru/forum/86386/page222#comment_3867386。

これはすでに基本的な統計関数を十分にカバーしている。


以前にこの記事を読んだことのある人は、もう一度読んでみることをお勧めする。昨日、新しい関数がたくさん追加された新バージョンの記事がリリースされた。

Quantumにプッシュメッセージを送る方法がまだわかりません。Rにもないかもしれないものを追加してください。

これは、平均区間を右に1つずらしたときの平均区間の簡単な計算である。同様にピアソン相関係数の計算。

ピアソンは正面から計算するとかなり難しい。しかし、反復計算の方法がある:K[i]からK[i-1]である。

面白いもので、ロシア語で各単語の後にカンマがある文章に出会ったのは初めてだ:

存在しないかもしれないものを追加してください。

 

なぜ必要な関数を自分で書かないのですか?

include/math/statにある関数の全ソースを見て、足りないものを書きなさい。

 
Renat Fatkhullin:

Rにはベクトル化もモダンな機能もない。そこにあるコードは、普通のプログラミングのジュニアが書いたものだ。確かに彼らはまともな数学者だが、平凡なプログラマーだ。

あなたは単にRもMQL5も知らないだけだ。

Rのソースを見ていないし、MQL5のソースも知らない。過去15年間コンパイラーを作ったこともないだろう。しかし、あなたはそれをすべてやってきた人たちと議論しようとしている。

私はプログラミングの知識はそこそこあるが、あなたが言うほどではない。

とにかく、あなたの言うC++におけるRの内部実装が、私が提起した実行速度の測定問題とは何の関係もないことはよく理解している。私が書いているのは、Rでコードを書く技術そのものについてであり、その中身が測定対象なのだ。

で、ベクトル化について。

Rでは文字列は普通に見える

с <- a+b

常に少なくともベクトル計算である。aや bが 何であるかは文脈による。

さらに

c <- sqrt(a)

はベクトルcを 与え、その各要素はベクトルaの 対応する要素の平方根となる。

この場合、aは 必ずしもベクトルである必要はなく、行列のようなより複雑なオブジェクトでもかまいません。

MQLではこれらは常にサイクルです。

さらに、Rにおけるベクトル化はオブジェクトそのものを意味するだけでなく、以下のような手続き的装置も意味する:

  • 特定の演算子applyと その変種という形の手続き的装置
  • ベクトル化されたすべての演算を実行するための標準MKL ライブラリの使用。

そして、前の投稿で書いたことの意味に戻る。

私は、C++関数の実装の質については何も書いていない。あなたのように、私はそれらをそのまま測定することを提案します。しかし、ベクトル化された操作に特化したR言語のツールを使ってね。

例えばこうだ。

すべてのテストについて、(あなたが持っているように)100で行列Mを形成し、各列は引用符をモデル化する。

そしてR上で、すべての列に対する最小値は次のようになる。

apply(M,  2, min)

結果は、各列の最小値を含むベクトルになります。

このパターンを使用して、我々は適切な適用で包まれたすべての分布関数の割合を測定する必要があります。これらの関数はたくさんあり、それぞれ異なっている。MKLには類似のものはない。

同時に、MKL ライブラリがRと一緒にインストールされていることを確認してください。

Intel® Math Kernel Library (Intel® MKL) | Intel® Software
  • software.intel.com
Intel® Math Kernel Library (Intel® MKL) accelerates math processing routines that increase application performance and reduce development time.
 
Renat Fatkhullin:

なぜ必要な関数を自分で書かないのですか?

include/math/statにある関数の全ソースを見て、足りないものを書けばいい。

面白いアイデアだ。

パッケージを移植するパフォーマーが見つかるかもしれない。例えばスプライン。最高品質のマッシュアップを 手に入れた。

 
СанСаныч Фоменко:

私はプログラミングの知識はそこそこありますが、あなたの言うような程度ではありません。

いずれにせよ、あなたの言うRの内部C++実装が、私が提起した実行速度の測定問題とは何の関係もないことはよく理解している。私が書いているのは、Rでコードを書く技術そのものであり、その内部にあるものを測定するのである。

残念ながら、あなたはRの内部がすべてC/C++であることを知らなかった。あなたは明らかに、システム関数でもインタプリタだと思っていた。


で、ベクトル化について。

Rでは文字列は普通に見える

с <- a+b

少なくともベクトル化された計算であることは間違いない。aや bが 何であるかという文脈による。

さらに

c <- sqrt(a)

はベクトルcを 与え、その各要素はベクトルaの 対応する要素の平方根となる。

この場合、aは 必ずしもベクトルである必要はなく、行列のような複雑なオブジェクトであってもよい。

MQLではこれらは常にサイクルです。

ループでより高速に処理する方法を紹介しました。そしてC++を使わずにMQL5の純粋なソースで。

そして最も単純なベクトルsqrtも打ち負かす。Rの完全なアナログを持つライブラリの標準関数を2つ紹介しよう:

bool MathSqrt(double &array[])                           // 結果を同じベクトルに入れる
bool MathSqrt(const double &array[],double &result[])    // 結果を別のベクトルに
比較する。

標準MQ5数学ライブラリの461の関数が、基本的な数学演算の膨大な範囲をカバーしていることを、あなたはまだよく理解していない。


さらに、Rにおけるベクトル化は、オブジェクトそのものだけでなく、以下のような手続き的装置も意味する:

  • 特定のapply 演算子とその変形という形の手続き的装置
  • ベクトル化された演算を実行するための標準MKL ライブラリの使用。

そう、そうだ。理論的には。

そして、すべての操作の99%は、アクセラレーションの機会もなく、最も単純な関数の中だけで行われます。

MQL5ではOpenCLが標準であり、サードパーティのライブラリなしですべてをアクセラレートできる。そして通常のMQL5では、C++のレベルで結果を得ることができる。

しかしRでは、各サイクルを高速化するパッケージを探すしか ない。そう、反復の回数で言えば、まさにすべてのサイクルだ。


そして、前の投稿で書いたことの意味に戻る。

あなたは深い知識を持っているのではなく、表面的な推論をしているだけなのだ。
 

このことに気づいている人はほとんどいないだろうが、MKLを使う場合、Rの入力データをMKLが動作する通常の配列に移動させ、その結果をRの内部データ表現形式に戻すという、すばらしいオーバーヘッドが発生する可能性がある

これについては詳しく調べていないが、論理的にはそのように見える。つまり、MKLサポートを提供するための深刻な出費を意味する。

MQL5では、もちろんそのような損失はまったくない。OpenCLではデータをコピーする必要があるが、そこではシンプルでフラットなmemcopyだ。

 
Renat Fatkhullin:

なぜ必要な関数を自分で書かないのですか?

私は一度書いたが、数学関数としてフォーマットしていない。

include/math/statにある関数の全ソースを見て、足りないものを書けばいい。

問題は、Quantumがそうであるように、それらを科学とプログラミングを組み合わせた標準ライブラリに 入れることだ。

おそらく、あなたのソリューションとの性能比較が必要になるだろう。そうすれば、自転車をmat.ライブラリに入れるよう説得できると思う。私自身はmat.パッケージでこれを見たことがない(Rについてはわからない)。

 

もう一つの小さな秘密 - MQL5が非常に高速な理由、特にライブラリがソースコードに完全に含まれている場合。

私たちのコンパイラーは非常に深い最適化に取り組んでおり、多くのチェックや条件をカットする能力を持っているため、関数は完全に消え、ループは極限まで単純化されます。もちろん、x64版に限ります。

他のシステムによるライブラリ/パッケージの使用(呼び出しの最適化すらできない)とは異なり、MQL5コンパイラーはほとんど常に完全なソースコードで動作し、常に最大深度までグローバル最適化を実行します。これは驚くべき結果をもたらします。

だからこそ、すべての標準ライブラリを ソースコードで提供することが重要なのです。決勝では、スピードの点でほとんどすべての人に勝てるように、すべてが過剰に最適化されることがわかっています。そして、マネージド言語のオーバーヘッドさえも、もうそれほど影響しない。