記事"MetaTrader 5での自己組織化機能マップ(Kohonenマップ)の使用"についてのディスカッション

 

新しい記事 MetaTrader 5での自己組織化機能マップ(Kohonenマップ)の使用 はパブリッシュされました:

自己組織化機能マップ(Kohonenマップ)の最も興味深い特徴に一つとして、データを監視することなく分類するという点です。基礎的な形式では、入力データの類似マップを作成します。SOMマップは、高次元のデータの分類とビジュアル化のために使用することができます。この記事では、Kohnenマップのいくつかの簡単な使用方法を紹介します。

作者: MetaQuotes Software Corp.

 

完成度が高く、何より美しい。

ユージンに質問なのですが、同じクラスを(マイナーチェンジして)すべてのSOM_exNファイルにコピーしたのですか?

そして2つ目の質問ですが、地図表示と地図計算の機能を1つのクラスにしているということでよろしいでしょうか?

 
sergeev:

ユージンへの質問ですが、すべてのSOM_exNファイルに同じクラスを(マイナーチェンジして)コピーしたのですか?

そして2つ目の質問ですが、地図表示と地図計算の機能を1つのクラスにしているということでよろしいでしょうか?

はい、その通りです。細かな変更は、解決したタスクの仕様(データの次元やRGB,CMYKの表示方法)によって発生します。地図表示関数と計算は1つのクラスにまとめられています。

一般的な構造は以下の通り:

//--- トレーニングセットを配列にロード m_training_sets_array[]
 KohonenMap.LoadData()
//--- ネットワークのトレーニング - ノードの重みの変更 m_som_nodes[].
 KohonenMap.Train();
//--- ノードの状態をcIntBMPクラスのインスタンスに「投影」する。
 KohonenMap.Render();
//--- 訓練セットの各要素について、地図上にキャプションを表示する。
//すなわち、訓練セットの各要素の識別子を図に追加する。
 KohonenMap.ShowTrainPatterns();
//--- グラフに画像を表示する
 KohonenMap.ShowBMP();

計算がTrainメソッドで行われ(場合によっては、RenderとShowBMPがその内部で呼び出され、トレーニング過程が表示される)、その結果がShowBMPメソッドで表示されるbmp画像に「転送」される。

レンダリングと表示にはcIntBMP クラスが使われている。

 
Quantum:

はい、その通りです。細かな変更は、解決すべき課題(データの次元やRGB,CMYKの表示方法)の仕様によるものです。地図表示関数と計算は1つのクラスにまとめられています。

その方がコードも少なくなるし、理解もしやすくなるはずだ。

特に、どのファイルにも同じ関数がある場合は。

 
sergeev:

そのほうがコードも少なくなるし、使いこなしやすくなるはずだ。

特に、同じ関数がすべてのファイルで同じであることに関してはね。

このアイデアは、コホネン・ネットワークを使うことの実用的な側面を示すものだった。

CSOM->CSomWeb、CSOM->CSomFoodという小さな階層がある(最初の例のように、すべて3次元)。フィッシャーの 虹彩の4次元のケースでは、CSOMとともに、CSomNodeも4つのコンポーネントを扱うために変更する必要があった。その後、コンポーネント・プレーンが登場し、m_bmpは配列になった。

そして、固定された特定の3次元(RGB)と4次元(CMYK)のデータを表示することを拒否した後、あらゆる次元のデータを扱うことができるSOM.mq5を手に入れ、以前の例のデータを特定のフォーマットのファイルに転送し、さらに成分プレーンの言語で解析を行う。

要するに、ツールとしてのsom.mq5が必要なのであり、他の例はすべてチュートリアル的な性格のもので、コホネン・ネットワークの特徴を説明したものにすぎない。

 

CSOM::ReadCSVData 関数内で

文字列が正しくない

// ネットワークの初期化、10000 回の反復、CellsX*CellsY ノードのグリッド、画像 ImageXSize x ImageYSize
int dimension=ArraySize(stringsarr)-1;
KohonenMap.InitParameters(dimension,10000,CellsX,CellsY,ImageXSize,ImageYSize);
 
sergeev:

CSOM::ReadCSVData 関数内で

文字列が間違っている

文字列という意味なら

int dimension=ArraySize(stringsarr)-1;

ディメンジョンは列数-1に等しいと仮定されます。

最後の列はトレーニングサンプルの文字列名です。例えば、products.csvでは

Protein;Carbohydrate;Fat;Title
0.4;11.8;0.1;Apples

の場合、最初の行頭にはコンポーネントの名前が含まれ、それらは配列 m_som_titles[] に格納されます。

その後、データ(m_training_sets_array[])とタイトル(m_train_titles[])が続きます。

 
いいえ、赤字で強調しました。
KohonenMap

あなたはこのクラスのオブジェクトをクラス自体に持っています。 ここに。

-------------------------

この点で、CSOM クラス単体のさらなる使用の観点から、それは必要である:

1. CSOMNodeCSOM クラス、およびそれらを使用するための特定のスクリプトを含む別々のファイル

2. CSOM クラスから特定のスクリプトへの外部入力 パラメータを削除する。

3. これらのパラメータをすべてクラス自体に追加する。

public:
    ColorSchemes m_clrSchema; // グラデーションスキーム
    int m_maxpict; // 並んだ写真の枚数
    bool m_bHexCell; // 六角形のセル
    bool m_bShowBorder; // 境界を表示する
    bool m_bShowTitle; // キャプションの表示

4.
この観点から、CSOM::Init 関数を拡張し、初期化のためのパラメータを 5 つ追加する(ReadCSVData で設定されるm_dimension を削除してもよい)。
Init(int iter, int xc, int yc, int bmpw, int bmph, int maxpic, ColorSchemes clrSchema, bool bhex, bool bborder, bool btitle)

これにより、CSOM クラスを Expert Advisor ファイルから取り出し、必要なプロジェクトの インクルードとして 使用することができます。

#property script_show_inputs

#include "SOM.mqh"

input string DataFileName="products.csv"; // データファイル名
input int CellsX=30; // Xによるノード数
input int CellsY=30; // Yのノード数
input int ImageW=250; // 画像の幅
input int ImageH=250; // 写真の高さ
input int MaxPictures=4; // 1行の最大画像数
input bool HexagonalCell=true; // 六角形のセル
input bool ShowBorders=false; // セルの境界線を表示する
input bool ShowTitles=true; // 座標平面に名前を表示する
input ColorSchemes ColorScheme=Blue_Green_Red; // グラデーションカラー

//------------------------------------------------------------------ OnStart
void OnStart()
{
  CSOM KohonenMap;
  MathSrand(200);
  // ファイルからトレーニングセットをロードする
  if(!KohonenMap.LoadTrainDataFromFile(DataFileName)) { Print("トレーニング用データの読み込みエラー"); return; }
  KohonenMap.Init(10000, CellsX, CellsY, ImageW, ImageH, MaxPictures, ColorScheme, HexagonalCell, ShowBorders, ShowTitles); // ネットワークの初期化
  KohonenMap.Train(); // ネットワーク・トレーニング
  KohonenMap.Render(); // マップ画像生成
  KohonenMap.ShowTrainPatterns(); // 訓練セットの各要素について、地図上にキャプションを表示する。
  KohonenMap.ShowBMP(); // チャート上に画像を表示する
}


そして、ヘッダー寸法と読み込まれた次のデータ行の不一致をチェックする。

追記。


それにしても、あなたのCSOMクラスは素晴らしいですねありがとう。
 
sergeev:


、ヘッダーの寸法と読み込んだ次の行のデータとの不一致をチェックする。

PS.

私はすでにこのクラスでこれらの操作をすべて行いました。

ご興味をお持ちいただき、有益なご提案をありがとうございました。

KohonenMap.InitParametersについては理解しました。

もちろん、最終的なクラスはご指摘のように修正する必要があります。

もちろん、ご指摘のように修正すれば、より美しくなります。

 

MQL5に関する最高の記事のひとつ。特に実践的な意味で。

ありがとう!

 
Quantum:

あなたが得たものを添付してください、我々はそれを記事に置き換えます。

変更点のリストを添付します:

1. 関数 cIntBMP::Show(int aX, int aY, string aBMPFileName, string aObjectName, boolaFromImages=true)

2. メインスクリプトに追加。

#import "shell32.dll"
   int ShellExecuteW(int hwnd, string oper, string prog, string param, string dir, int show);
#import

input bool OpenAfterAnaliz=true; // 完了後、地図フォルダを開く

CSOM クラスの変更点

1.CSOM::HideChart 関数を追加 - チャートやグリッドなどを背景色の下で薄暗くする
2.パラメータm_chart, m_wnd, m_x0, m_y0 を追加 - 地図をどのチャート、どのウィンドウに表示するかを示す。
+ オブジェクト名の 接頭辞m_sID を 追加。接頭辞はファイル名によって自動的に取られ、そうでない場合は "SOM" が割り当てられる
3. マップはm_sID という名前のフォルダに書き込まれる
4.
bmp ファイル 名は、トレーニングパターン列の 名前によって与えられる。
4.CSOM::ShowBMP 関数を変更 - マップは Images フォルダにコピーされず、Files に残る(そうしないと非常に時間がかかる)
5.CSOM::NetDeinit 関数の代わりにCSOM::HideBMP 関数を追加
7.CSOM::ReadCSVData 関数が、最初の カラムが名前カラムになるようにファイルを読み込むように再設定された
6.CSOM::Train 関数に中間マップを表示するフラグを追加CSOM::Train( boolbShowProgress)
8.CSOM::Train 関数において、中間データを繰り返し表示する代わりに2秒毎に表示するようにしました。
また、進捗通知をログからCommentに 移動しました。
9.いくつかの変数名が短縮され、関数が分類されました。

Bmpレンダリングは処理を非常に遅くする。ですから、むやみに使わないほうがいいでしょう。

この例では、マップはExpert Advisorの最適化データに基づいています。
ファイル: