Diskussion zum Artikel "Verwendung von selbstorganisierenden Karten (Kohonenkarten) in MetaTrader 5"

 

Neuer Artikel Verwendung von selbstorganisierenden Karten (Kohonenkarten) in MetaTrader 5 :

Einer der interessantesten Aspekte von selbstorganisierenden Karten (Kohonenkarten) ist, dass sie ohne Beaufsichtigung lernen, Daten zu klassifizieren. Im einfachsten Fall erstellen sie eine Ähnlichkeitskarte von Eingabedaten (Clustering). SOM-Karten können für die Klassifizierung und Visualisierung von hochdimensionalen Daten genutzt werden. In diesem Beitrag werden wir mehrere einfache Anwendungsbeispiele von Kohonenkarten betrachten.

In MQL5 sind die Web-Farben vordefinierte Konstanten.

Abbildung 7. Web-Farben

Abbildung 7. Web-Farben

Was wäre, wenn wir den Kohonen-Algorithmus auf einen Vektorsatz mit ähnlichen Komponenten anwenden?

Wir können die von der CSOM-Klasse abgeleitete Klasse CSOMWeb erstellen:

//+------------------------------------------------------------------+
//| CSOMWeb class                                                    |
//+------------------------------------------------------------------+
class CSOMWeb : public CSOM
  {
public:
//--- adds a color to training set (used for colors, instead of AddTrainPattern)
   void              AddTrainColor(int col);
//--- method of showing of title of the pattern (used for colors, instead of ShowPattern)
   void              ShowColor(int col,string name);
  };

Wie Sie sehen können, haben wir zwei neue Methoden hinzugefügt, um die Arbeit mit Farben zu vereinfachen. Die explizite Festlegung von Farbkomponenten ist nicht mehr erforderlich.

Autor: MetaQuotes Software Corp.

 

Vollständig und vor allem schön.

So eine Frage an Eugene - hast du die gleiche Klasse (mit kleinen Änderungen) in alle SOM_exN-Dateien kopiert?

Und die zweite Frage - habe ich richtig verstanden, dass Sie die Funktionen der Kartenanzeige und der Kartenberechnung in einer Klasse haben?

 
sergeev:

Eine solche Frage an Eugene - haben Sie die gleiche Klasse (mit kleinen Änderungen) in alle SOM_exN-Dateien kopiert?

und die zweite Frage - habe ich richtig verstanden, dass Sie die Funktionen der Kartendarstellung und der Kartenberechnung in einer Klasse haben?

Ja, Sie haben recht, die Klasse ist die gleiche. Geringfügige Änderungen ergeben sich aus den Besonderheiten der gelösten Aufgaben (Dimensionalität der Daten und RGB- und CMYK-Anzeigemethoden). Kartendarstellungsfunktionen und Berechnungen sind in einer Klasse zusammengefasst.

Die allgemeine Struktur ist wie folgt:

//--- Laden der Trainingsmenge in das Array m_training_sets_array[]
 KohonenMap.LoadData()
//--- Netztraining - Änderung der Knotengewichte m_som_nodes[]
 KohonenMap.Train();
//--- Bildung eines Bildes mit einer Karte - "Projektion" des Zustands von Knoten in eine Instanz der Klasse cIntBMP
 KohonenMap.Render();
//--- Anzeige der Beschriftungen auf der Karte für jedes Element der Trainingsmenge 
//d.h. die Kennungen der einzelnen Elemente des Trainingssatzes in die Abbildung einfügen
 KohonenMap.ShowTrainPatterns();
//--- das Bild im Diagramm anzeigen
 KohonenMap.ShowBMP();

Die Berechnung wird in der Train-Methode durchgeführt (in einigen Fällen werden Render und ShowBMP darin aufgerufen, um den Trainingsprozess zu zeigen), dann werden die Ergebnisse in ein bmp-Bild "übertragen", das in der ShowBMP-Methode angezeigt wird.

Zum Rendern und Anzeigen wurde die Klasse cIntBMP verwendet.

 
Quantum:

Ja, Sie haben recht, die Klasse ist die gleiche. Geringfügige Änderungen sind auf die Besonderheiten der zu lösenden Aufgaben zurückzuführen (Dimensionalität der Daten und RGB- und CMYK-Anzeigemethoden ). Die Funktionen zur Kartendarstellung und die Berechnungen sind in einer Klasse zusammengefasst.

Vielleicht sollten wir dann, um die Arbeit mit den Klassen zu erleichtern, diese in eine Hierarchie umwandeln? Ich bin mir sicher, dass dies den Code reduziert und es einfacher macht, sich damit vertraut zu machen.

Vor allem, wenn es sich um die gleichen Funktionen handelt, die in allen Dateien identisch sind.

 
sergeev:

Vielleicht sollten wir sie in eine Hierarchie umwandeln, um die Arbeit mit den Klassen zu erleichtern? Ich bin sicher, dass dies den Code reduzieren und die Einarbeitung erleichtern würde.

Besonders wenn es darum geht, dass die gleichen Funktionen in allen Dateien gleich sind.

Die Idee war, praktische Aspekte der Verwendung von Kohonen-Netzen zu zeigen.

Methodisch erwies es sich als bequemer, alle Aufgaben getrennt zu betrachten. Es gibt eine kleine Hierarchie, CSOM->CSomWeb, CSOM->CSomFood (alle dreidimensional, wie im ersten Beispiel). Im 4-dimensionalen Fall von Fishers Schwertlilien musste neben CSOM auch CSomNode geändert werden, um die 4 Komponenten zu behandeln. Dann erschienen Komponentenebenen und m_bmp wurde zu einem Array.

Dann, nachdem wir uns geweigert hatten, bestimmte 3-dimensionale (RGB) und 4-dimensionale (CMYK) Daten anzuzeigen, bekamen wir SOM.mq5, das es erlaubt, mit Daten beliebiger Dimension zu arbeiten, die Daten der vorherigen Beispiele wurden in Dateien eines bestimmten Formats übertragen, und ihre Analyse wird weiterhin in der Sprache der Komponentenebenen durchgeführt.

Im Grunde genommen brauchen wir som.mq5 als Werkzeug, und alle anderen Beispiele haben Übungscharakter und sind nur Illustrationen der Eigenschaften von Kohonen-Netzen.

 

in der Funktion CSOM::ReadCSVData

String ist falsch

// Netzinitialisierung, 10000 Iterationen, Gitter aus CellsX*CellsY-Knoten, Bild ImageXSize x ImageYSize
int dimension=ArraySize(stringsarr)-1;
KohonenMap.InitParameters(dimension,10000,CellsX,CellsY,ImageXSize,ImageYSize);
 
sergeev:

in der Funktion CSOM::ReadCSVData

string ist falsch

Wenn Sie string meinen:

int dimension=ArraySize(stringsarr)-1;

Es handelt sich um die Besonderheiten des Formats der Eingabedatei - es wird angenommen, dass die Dimension gleich der Anzahl der Spalten-1 ist.

Die letzte Spalte ist der Stringname des Trainingsmusters. Zum Beispiel, in products.csv

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

die erste Kopfzeile, die die Namen der Komponenten enthält, wird in das Array m_som_titles[] übertragen.

Dann folgen die Daten (in m_training_sets_array[]) und die Titel (in m_train_titles[]).

 
Nein, ich habe es rot hervorgehoben.
KohonenMap

Sie haben ein Objekt dieser Klasse in der Klasse selbst. Hier.

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

Diesbezüglich ist es aus Sicht der weiteren Verwendung der Klasse CSOM standalone notwendig:

1. Getrennte Dateien mit CSOMNode, CSOM-Klassen und spezifischen Skripten für deren Verwendung

2. Externe Eingabeparameter aus der CSOM-Klasse in ein spezifisches Skript zu entfernen.

3. Fügen Sie alle diese Parameter in die Klasse selbst ein.

public:
    ColorSchemes m_clrSchema; // Steigungsschema
    int m_maxpict; // Anzahl der Bilder in einer Reihe
    bool m_bHexCell; // Sechseckige Zellen
    bool m_bShowBorder; // Grenzen anzeigen
    bool m_bShowTitle; // Beschriftungen anzeigen

4.
Erweitern Sie in diesem Zusammenhang die Funktion CSOM::Init um 5 Parameter für die Initialisierung (Sie können m_dimension entfernen, das in ReadCSVData gesetzt wird)
Init(int iter, int xc, int yc, int bmpw, int bmph, int maxpic, ColorSchemes clrSchema, bool bhex, bool bborder, bool btitle)

Auf diese Weise können Sie die CSOM-Klasse aus der Expert Advisor-Datei herausnehmen und sie einfach als Include in den erforderlichen Projekten verwenden

#property script_show_inputs

#include "SOM.mqh"

input string DataFileName="products.csv"; // Name der Datendatei
input int CellsX=30; // Anzahl der Knoten nach X
input int CellsY=30; // Anzahl der Knoten in Y
input int ImageW=250; // Bildbreite
input int ImageH=250; // Bildhöhe
input int MaxPictures=4; // max. Bilder pro Zeile
input bool HexagonalCell=true; // Sechseckige Zellen
input bool ShowBorders=false; // Zellgrenzen anzeigen
input bool ShowTitles=true; // Anzeige von Namen in Koordinatenebenen
input ColorSchemes ColorScheme=Blue_Green_Red; // Farbverläufe

//------------------------------------------------------------------ OnStart
void OnStart()
{
  CSOM KohonenMap;
  MathSrand(200);
  // Laden des Trainingssatzes aus der Datei
  if(!KohonenMap.LoadTrainDataFromFile(DataFileName)) { Print("Fehler beim Laden von Daten für das Training"); return; }
  KohonenMap.Init(10000, CellsX, CellsY, ImageW, ImageH, MaxPictures, ColorScheme, HexagonalCell, ShowBorders, ShowTitles); // Initialisierung des Netzes
  KohonenMap.Train(); // Netzausbildung
  KohonenMap.Render(); // Erzeugung von Kartenbildern
  KohonenMap.ShowTrainPatterns(); // Anzeige von Beschriftungen auf der Karte für jedes Element der Trainingsmenge
  KohonenMap.ShowBMP(); // das Bild in der Tabelle anzeigen
}

Und noch eine Änderung - machen Sie die ReadCSVData-Funktion vorsichtshalber auch zu einem bool.
und prüfen Sie, ob die Header-Dimensionen und die nächste gelesene Datenzeile nicht übereinstimmen

PS.

Ich habe alle diese Änderungen an der Klasse bereits vorgenommen, sozusagen Kleinigkeiten finalisiert.
Aber trotzdem ist Ihre CSOM-Klasse einfach genial. Danke dafür.
 
sergeev:

und eine weitere Änderung - nur für den Fall - machen Sie die ReadCSVData-Funktion auch bool.
und prüfen Sie, ob die Header-Dimensionen und die gelesene nächste Datenzeile nicht übereinstimmen

PS.

Ich habe bereits alle diese Änderungen an der Klasse vorgenommen, sozusagen die kleinen Dinge abgeschlossen.

Vielen Dank für Ihr Interesse und Ihre nützlichen Empfehlungen.

Das mit KohonenMap.InitParameters habe ich verstanden, es ist offensichtlich ein Fehler.

Natürlich sollte die endgültige Klasse so korrigiert werden, wie Sie es vorgeschlagen haben, dann wird sie viel schöner sein.

Bitte fügen Sie bei, was Sie haben, wir werden es im Artikel ersetzen.

 

Einer der besten Artikel über MQL5. Und vor allem im praktischen Sinne.

Ich danke Ihnen!

 
Quantum:

Bitte fügen Sie an, was Sie haben, wir werden es in dem Artikel ersetzen.

beigefügt. Liste der Änderungen:

1. kleine Änderung in der Funktion cIntBMP::Show(int aX, int aY, string aBMPFileName, string aObjectName, bool aFromImages=true)

2. zum Hauptskript hinzugefügt

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

input bool OpenAfterAnaliz=true; // Öffnen des Kartenordners nach Fertigstellung

Änderungen in der CSOM-Klasse

1. Funktion CSOM::HideChart hinzugefügt - sie blendet das Diagramm, das Raster usw. unter der Hintergrundfarbe aus
2. Parameter m_chart, m_wnd, m_x0, m_y0 hinzugefügt - sie geben an, in welchem Diagramm und in welchem Fenster die Karten angezeigt werden sollen.
+ Präfix des Objektnamens m_sID. Das Präfix wird automatisch vom Dateinamen übernommen, ansonsten wird "SOM" zugewiesen
3. Karten werden in den Ordner mit dem Namen m_sID geschrieben
4. Die Namen der
bmp-Dateien werden durch den Namen der Trainingsmuster-Spalte gegeben.
4. Geänderte CSOM::ShowBMP-Funktion - Karten werden nicht in den Ordner Images kopiert, sondern verbleiben in Files (sonst sehr zeitaufwendig)
5. Statt der Funktion CSOM::NetDeinit gibt es jetzt die Funktion CSOM::HideBMP
7. Die Funktion CSOM::ReadCSVData wurde umkonfiguriert, um die Datei so zu lesen, dass die erste Spalte die Namensspalte ist
6. Der Funktion CSOM::Train wurde ein Flag zur Anzeige von Zwischenbildern hinzugefügt CSOM::Train( bool bShowProgress)
8. In der Funktion CSOM::Train werden die Zwischendaten alle 2 Sekunden anstelle der Iterationen angezeigt,
und auch die Fortschrittsanzeige wurde vom Protokoll in den Kommentar verschoben
9. Einige Variablennamen wurden verkürzt und die Funktionen kategorisiert.

Das Rendering von Bmp verlangsamt den Prozess sehr stark. Daher ist es besser, es nicht unnötig zu verwenden.

In diesem Beispiel basieren die Karten auf den Optimierungsdaten des Expert Advisors.
Dateien: