Discussion de l'article "Utiliser des Cartes de Caractéristiques Auto-Organisatrices (Kohonen Maps) dans MetaTrader 5"

 

Un nouvel article Utiliser des Cartes de Caractéristiques Auto-Organisatrices (Kohonen Maps) dans MetaTrader 5 a été publié :

L'un des aspects les plus intéressants des cartes de caractéristiques auto-organisatrices (cartes de Kohonen) est qu'elles apprennent à classer les données sans supervision. Dans sa forme de base, il produit une carte de similarité des données d'entrée (regroupement). Les cartes SOM peuvent être utilisées pour la classification et la visualisation de données de grande dimension. Dans cet article, nous examinerons plusieurs applications simples des cartes de Kohonen.

Nous pouvons également constater ce fait sur le plan des composants des Trades (zones vertes avec des nombres inférieurs à 20).

Figure 27.Plans de composant de  Trades-MovingShift

Figure 27. Plans de composants Trades-MovingShift

Auteur : MetaQuotes

 

Complet et surtout magnifique.

Une question à Eugène : avez-vous copié la même classe (avec des modifications mineures) dans tous les fichiers SOM_exN ?

Et la deuxième question - ai-je bien compris que vous avez regroupé les fonctions d'affichage et de calcul de la carte dans une seule classe ?

 
sergeev:

Une question à Eugène : avez-vous copié la même classe (avec des modifications mineures) dans tous les fichiers SOM_exN ?

et la deuxième question - ai-je bien compris que vous avez les fonctions d'affichage et de calcul de la carte dans une seule classe ?

Oui, vous avez raison, la classe est la même. Des changements mineurs sont dus aux spécificités des tâches résolues (dimensionnalité des données et méthodes d'affichage RVB, CMJN). Les fonctions d'affichage des cartes et les calculs sont combinés en une seule classe.

La structure générale est la suivante

//--- charger l'ensemble d'entraînement dans le tableau m_training_sets_array[]
 KohonenMap.LoadData()
//--- formation du réseau - modification des poids des nœuds m_som_nodes[]
 KohonenMap.Train();
//--- former une image avec une carte - "projeter" l'état des nœuds dans une instance de la classe cIntBMP
 KohonenMap.Render();
//--- afficher les légendes sur la carte pour chacun des éléments de l'ensemble d'apprentissage 
//c'est-à-dire ajouter à la figure les identifiants de chaque élément de l'ensemble d'apprentissage
 KohonenMap.ShowTrainPatterns();
//--- montrer l'image sur le graphique
 KohonenMap.ShowBMP();

le calcul est effectué dans la méthode Train (dans certains cas, Render et ShowBMP sont appelés à l'intérieur de cette méthode pour montrer le processus d'apprentissage), puis les résultats sont "transférés" dans une image bmp qui est affichée dans la méthode ShowBMP.

La classe cIntBMP a été utilisée pour le rendu et l'affichage.

 
Quantum:

Oui, vous avez raison, la classe est la même. Des changements mineurs sont dus aux spécificités des tâches à résoudre (dimensionnalité des données et méthodes d'affichage RVB, CMJN). Les fonctions d'affichage des cartes et les calculs sont combinés dans une seule classe.

Peut-être que pour faciliter le travail avec les classes, nous devrions les hiérarchiser ? je suis sûr que cela réduira le code et facilitera sa prise en main.

Je suis persuadé que cela réduira le code et facilitera sa prise en main, surtout lorsqu'il s'agit de fonctions identiques dans tous les fichiers.

 
sergeev:

Peut-être que pour faciliter le travail avec les classes, nous devrions le transformer en hiérarchie ? Je suis sûr que cela réduira le code et facilitera la prise en main.

L'idée était de montrer les aspects pratiques de l'utilisation des réseaux Kohonen, en particulier lorsqu'il s'agit de fonctions identiques dans tous les fichiers.

L'idée était de montrer les aspects pratiques de l'utilisation des réseaux de Kohonen.

D'un point de vue méthodologique, il s'est avéré plus pratique de considérer toutes les tâches séparément. Il existe une petite hiérarchie, CSOM->CSomWeb, CSOM->CSomFood (toutes tridimensionnelles, comme dans le premier exemple). Dans le cas quadridimensionnel des iris de Fisher, CSOM et CSomNode ont dû être modifiés pour gérer les 4 composants. Ensuite, les plans de composants sont apparus et m_bmp est devenu un tableau.

Ensuite, après avoir refusé d'afficher des données tridimensionnelles (RVB) et quadridimensionnelles (CMJN) fixes et spécifiques, nous avons obtenu SOM.mq5, qui permet de travailler avec des données de n'importe quelle dimension, les données des exemples précédents ont été transférées dans des fichiers d'un certain format, et leur analyse est ensuite effectuée dans le langage des plans de composants.

En fait, nous avons besoin de som.mq5 en tant qu'outil, et tous les autres exemples sont de nature didactique et ne sont que des illustrations des caractéristiques des réseaux de Kohonen.

 

dans la fonction CSOM::ReadCSVData

la chaîne de caractères est incorrecte

// initialisation du réseau, 10000 itérations, grille de nœuds CellsX*CellsY, image ImageXSize x ImageYSize
int dimension=ArraySize(stringsarr)-1;
KohonenMap.InitParameters(dimension,10000,CellsX,CellsY,ImageXSize,ImageYSize);
 
sergeev:

dans la fonction CSOM::ReadCSVData

la chaîne de caractères n'est pas correcte

Si vous voulez dire string :

int dimension=ArraySize(stringsarr)-1;

il s'agit des spécificités du format du fichier de données d'entrée - la dimension est supposée être égale au nombre de colonnes-1.

La dernière colonne est le nom de la chaîne de l'échantillon d'entraînement. Par exemple, dans products.csv

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

le premier en-tête de ligne, contenant les noms des composants, sera placé dans le tableau m_som_titles[].

Les données (dans m_training_sets_array[]) et les titres (dans m_train_titles[]) suivent.

 
Non, je l'ai surligné en rouge.
KohonenMap

vous avez un objet de cette classe dans la classe elle-même. Ici.

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

À cet égard, du point de vue de l'utilisation ultérieure de la classe CSOM standalone, il est nécessaire :

1. Des fichiers séparés avec CSOMNode, les classes CSOM et les scripts spécifiques de leur utilisation.

2. Supprimer les paramètres d'entrée externes de la classe CSOM dans un script spécifique.

3. Ajouter tous ces paramètres dans la classe elle-même

public:
    ColorSchemes m_clrSchema; // schéma de gradient
    int m_maxpict; // nombre d'images dans une rangée
    bool m_bHexCell; // cellules hexagonales
    bool m_bShowBorder; // indiquer les limites
    bool m_bShowTitle; // afficher les légendes

4.
À cet égard, ajoutez à la fonction CSOM::Init 5 paramètres d'initialisation (vous pouvez supprimer m_dimension, qui est défini dans ReadCSVData).
Init(int iter, int xc, int yc, int bmpw, int bmph, int maxpic, ColorSchemes clrSchema, bool bhex, bool bborder, bool btitle)

Cela vous permettra de retirer la classe CSOM du fichier Expert Advisor et de l'utiliser simplement comme inclusion dans les projets nécessaires.

#property script_show_inputs

#include "SOM.mqh"

input string DataFileName="products.csv"; // Nom du fichier de données
input int CellsX=30; // Nombre de nœuds par X
input int CellsY=30; // Nombre de nœuds dans Y
input int ImageW=250; // Largeur de l'image
input int ImageH=250; // Hauteur de l'image
input int MaxPictures=4; // nombre maximal d'images par ligne
input bool HexagonalCell=true; // Cellules hexagonales
input bool ShowBorders=false; // afficher les limites des cellules
input bool ShowTitles=true; // affichage des noms dans les plans de coordonnées
input ColorSchemes ColorScheme=Blue_Green_Red; // Couleurs dégradées

//------------------------------------------------------------------ OnStart
void OnStart()
{
  CSOM KohonenMap;
  MathSrand(200);
  // charger l'ensemble de formation à partir du fichier
  if(!KohonenMap.LoadTrainDataFromFile(DataFileName)) { Print("Erreur de chargement des données pour l'entraînement"); return; }
  KohonenMap.Init(10000, CellsX, CellsY, ImageW, ImageH, MaxPictures, ColorScheme, HexagonalCell, ShowBorders, ShowTitles); // initialisation du réseau
  KohonenMap.Train(); // formation au réseau
  KohonenMap.Render(); // génération d'images de cartes
  KohonenMap.ShowTrainPatterns(); // afficher des légendes sur la carte pour chaque élément de l'ensemble d'apprentissage
  KohonenMap.ShowBMP(); // afficher l'image sur le graphique
}

et une autre modification - juste au cas où - faire de la fonction ReadCSVData un bool aussi.
et vérifier la non-concordance des dimensions de l'en-tête et lire la ligne de données suivante.

PS.

J'ai déjà effectué toutes ces manipulations avec la classe, pour ainsi dire, j'ai finalisé de petites choses.
Mais votre classe CSOM est tout simplement géniale. Je vous remercie.
 
sergeev:

et une autre modification - juste au cas où - rendre la fonction ReadCSVData bool également.
et vérifier la non-concordance entre les dimensions de l'en-tête et la lecture de la ligne de données suivante.

PS.

J'ai déjà fait toutes ces manipulations avec la classe, pour ainsi dire, j'ai finalisé les petites choses.

Merci beaucoup pour votre intérêt et vos recommandations utiles.

Je comprends pour KohonenMap.InitParameters, c'est évidemment une erreur.

Bien sûr, la classe finale devrait être corrigée comme vous l'avez suggéré, elle sera beaucoup plus belle.

Veuillez joindre ce que vous avez obtenu, nous le remplacerons dans l'article.

 

Un des meilleurs articles sur MQL5. Et surtout d'un point de vue pratique.

Je vous remercie !

 
Quantum:

Veuillez joindre ce que vous avez obtenu, nous le remplacerons dans l'article.

Liste des changements en pièce jointe :

1. petit changement dans la fonction cIntBMP::Show(int aX, int aY, string aBMPFileName, string aObjectName, bool aFromImages=true)

2. dans le script principal ajouté

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

input bool OpenAfterAnaliz=true; // ouverture du dossier de la carte après achèvement

Changements dans la classe CSOM

1. Ajout de la fonction CSOM::HideChart - elle réduit le graphique, la grille, etc. sous la couleur d'arrière-plan
2. Ajout des paramètres m_chart, m_wnd, m_x0, m_y0 - indiquant sur quel graphique et quelle fenêtre afficher les cartes.
+ Le préfixe est automatiquement repris par le nom du fichier, sinon il est attribué à "SOM"
3. Les cartes sont écrites dans le dossier nommé m_sID
4. Les noms des fichiers bmp sont donnés par le nom de la colonne du modèle d'entraînement.
4. Modification de la fonction CSOM::ShowBMP - les cartes ne sont pas copiées dans le dossier Images, mais restent dans Files (sinon, cela prend beaucoup de temps)
5. Au lieu de la fonction CSOM::NetDeinit - il y a maintenant la fonction CSOM::HideBMP
7. La fonction CSOM::ReadCSVData est reconfigurée pour lire le fichier de manière à ce que la première colonne soit la colonne des noms
6. Ajout d'un drapeau à la fonction CSOM::Train pour afficher les cartes intermédiaires CSOM::Train( bool bShowProgress)
8. Dans la fonction CSOM::Train, les données intermédiaires sont affichées toutes les 2 secondes au lieu des itérations,
et la notification de la progression est déplacée du journal au commentaire
9. Certains noms de variables sont raccourcis et les fonctions sont catégorisées.

Le rendu Bmp ralentit considérablement le processus. Il est donc préférable de ne pas l'utiliser inutilement.

Dans l'exemple, les cartes sont basées sur les données d'optimisation de l'Expert Advisor.
Dossiers :