Discussione sull’articolo "Utilizzo di feature map auto-organizzanti (mappe Kohonen) su MetaTrader 5"

 

Il nuovo articolo Utilizzo di feature map auto-organizzanti (mappe Kohonen) su MetaTrader 5 è stato pubblicato:

Uno degli aspetti più interessanti delle feature map auto-organizzanti (mappe Kohonen) è che imparano a classificare i dati senza supervisione. Nella sua forma base, produce una mappa di similarità dei dati di input (clustering). Le mappe SOM (Self-Organizing Map) possono essere utilizzate per la classificazione e la visualizzazione di dati ad alta dimensionalità. In questo articolo considereremo alcune semplici applicazioni delle mappe Kohonen.

La Fig.1 mostra una semplice mappa di Kohonen come griglia di 16 nodi (4x4 ciascuno di essi è connesso con un vettore di input tridimensionale).

Figura 1. Mappa di Kohonen semplice (16 nodi)

Figura 1. Mappa di Kohonen semplice (16 nodi)

Autore: MetaQuotes

 

Completo e soprattutto bello.

Una domanda a Eugene: hai copiato la stessa classe (con piccole modifiche) in tutti i file SOM_exN?

e la seconda domanda - ho capito bene che hai le funzioni di visualizzazione e di calcolo della mappa in un'unica classe?

 
sergeev:

Una domanda a Eugene: hai copiato la stessa classe (con piccole modifiche) in tutti i file SOM_exN?

e la seconda domanda: ho capito bene che avete le funzioni di visualizzazione e di calcolo della mappa in un'unica classe?

Sì, hai ragione, la classe è la stessa. Piccole modifiche sono dovute alle specificità dei compiti risolti (dimensionalità dei dati e metodi di visualizzazione RGB e CMYK). Le funzioni di visualizzazione delle mappe e i calcoli sono stati combinati in un'unica classe.

La struttura generale è la seguente:

//--- caricare il set di allenamento nell'array m_training_sets_array[]
 KohonenMap.LoadData()
//--- formazione della rete - modifica dei pesi dei nodi m_som_nodes[]
 KohonenMap.Train();
//--- formare un'immagine con una mappa - "proiettare" lo stato dei nodi in un'istanza della classe cIntBMP
 KohonenMap.Render();
//--- mostra le didascalie sulla mappa per ciascuno degli elementi dell'insieme di allenamento 
//cioè aggiungere alla figura gli identificatori di ogni elemento dell'insieme di addestramento
 KohonenMap.ShowTrainPatterns();
//--- mostra l'immagine sul grafico
 KohonenMap.ShowBMP();

i calcoli vengono eseguiti nel metodo Train (in alcuni casi vengono richiamati Render e ShowBMP al suo interno per mostrare il processo di addestramento), quindi i risultati vengono "trasferiti" in un'immagine bmp che viene visualizzata nel metodo ShowBMP.

Per il rendering e la visualizzazione è stata utilizzata la classe cIntBMP.

 
Quantum:

Sì, hai ragione, la classe è la stessa. Le modifiche minori sono dovute alle specificità dei compiti da risolvere (dimensionalità dei dati e metodi di visualizzazione RGB e CMYK). Le funzioni di visualizzazione delle mappe e i calcoli sono stati combinati in un'unica classe.

Forse per comodità di lavoro con le classi dovremmo trasformarle in una gerarchia: sono sicuro che ridurrebbe il codice e renderebbe più facile familiarizzarsi con esso.

Soprattutto quando si tratta di funzioni identiche in tutti i file.

 
sergeev:

Forse, per comodità di lavoro con le classi, dovremmo trasformarle in una gerarchia. Sono sicuro che ridurrà il codice e renderà più facile familiarizzarsi con esso.

Soprattutto quando si tratta di funzioni uguali in tutti i file.

L'idea era quella di mostrare gli aspetti pratici dell'uso delle reti Kohonen.

Dal punto di vista metodologico è risultato più conveniente considerare tutti i compiti separatamente. c'è una piccola gerarchia, CSOM->CSomWeb, CSOM->CSomFood (tutti tridimensionali, come il primo esempio). Nel caso a 4 dimensioni delle iridi di Fisher, oltre a CSOM, è stato necessario modificare anche CSomNode per gestire i 4 componenti. Poi sono apparsi i piani delle componenti e m_bmp è diventato un array.

Poi, dopo aver rifiutato di visualizzare dati tridimensionali (RGB) e quadridimensionali (CMYK) fissi, abbiamo ottenuto SOM.mq5, che consente di lavorare con dati di qualsiasi dimensione; i dati degli esempi precedenti sono stati trasferiti in file di un certo formato e la loro analisi viene ulteriormente effettuata nel linguaggio dei piani componenti.

In sostanza, som.mq5 ci serve come strumento e tutti gli altri esempi sono di natura tutoriale e illustrano solo le caratteristiche delle reti di Kohonen.

 

nella funzione CSOM::ReadCSVData

la stringa non è corretta

// inizializzazione della rete, 10000 iterazioni, griglia di nodi CellsX*CellsY, immagine ImageXSize x ImageYSize
int dimension=ArraySize(stringsarr)-1;
KohonenMap.InitParameters(dimension,10000,CellsX,CellsY,ImageXSize,ImageYSize);
 
sergeev:

nella funzione CSOM::ReadCSVData

stringa è sbagliato

Se si intende stringa:

int dimension=ArraySize(stringsarr)-1;

è la specifica del formato del file di dati di input - si presume che la dimensione sia uguale al numero di colonne-1.

L'ultima colonna è il nome stringa del campione di allenamento. Ad esempio, in prodotti.csv

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

l'intestazione della prima riga, contenente i nomi dei componenti, andrà nell'array m_som_titoli[].

Seguono i dati (in m_training_sets_array[]) e i titoli (in m_train_titles[]).

 
No, l'ho evidenziato in rosso.
KohonenMap

avete un oggetto di questa classe nella classe stessa. Qui.

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

A questo proposito, dal punto di vista dell'ulteriore utilizzo della classe CSOM standalone è necessario:

1. File separati con CSOMNode, classi CSOM e script specifici per il loro utilizzo.

2. Rimuovere i parametri di input esterni dalla classe CSOM a uno script specifico.

3. Aggiungere tutti questi parametri nella classe stessa

public:
    ColorSchemes m_clrSchema; // schema del gradiente
    int m_maxpict; // numero di immagini in fila
    bool m_bHexCell; // celle esagonali
    bool m_bShowBorder; // mostra i confini
    bool m_bShowTitle; // mostra le didascalie

4.
A questo proposito, espandere la funzione CSOM::Init con 5 parametri per l'inizializzazione (è possibile rimuovere m_dimension, che viene impostato in ReadCSVData).
Init(int iter, int xc, int yc, int bmpw, int bmph, int maxpic, ColorSchemes clrSchema, bool bhex, bool bborder, bool btitle)

In questo modo sarà possibile estrarre la classe CSOM dal file di Expert Advisor e utilizzarla semplicemente come inclusione nei progetti necessari.

#property script_show_inputs

#include "SOM.mqh"

input string DataFileName="products.csv"; // Nome del file di dati
input int CellsX=30; // Numero di nodi per X
input int CellsY=30; // Numero di nodi in Y
input int ImageW=250; // Larghezza dell'immagine
input int ImageH=250; // Altezza dell'immagine
input int MaxPictures=4; // massimo di immagini per riga
input bool HexagonalCell=true; // Celle esagonali
input bool ShowBorders=false; // mostra i bordi delle celle
input bool ShowTitles=true; // visualizzazione dei nomi nei piani di coordinate
input ColorSchemes ColorScheme=Blue_Green_Red; // Colori sfumati

//------------------------------------------------------------------ OnStart
void OnStart()
{
  CSOM KohonenMap;
  MathSrand(200);
  // caricare il set di allenamento dal file
  if(!KohonenMap.LoadTrainDataFromFile(DataFileName)) { Print("Errore nel caricamento dei dati per la formazione"); return; }
  KohonenMap.Init(10000, CellsX, CellsY, ImageW, ImageH, MaxPictures, ColorScheme, HexagonalCell, ShowBorders, ShowTitles); // inizializzazione della rete
  KohonenMap.Train(); // formazione della rete
  KohonenMap.Render(); // generazione dell'immagine della mappa
  KohonenMap.ShowTrainPatterns(); // mostra le didascalie sulla mappa per ogni elemento dell'insieme di addestramento
  KohonenMap.ShowBMP(); // mostra l'immagine sul grafico
}

e un'altra modifica: per sicurezza, rendere bool anche la funzione ReadCSVData.
e verificare la mancata corrispondenza tra le dimensioni dell'intestazione e la riga di dati successiva letta.

PS.

Ho già fatto tutte queste manipolazioni con la classe, per così dire, finalizzato piccole cose.
Ma ancora la tua classe CSOM è semplicemente fantastica. Grazie.
 
sergeev:

e un'altra modifica - per sicurezza - rende bool anche la funzione ReadCSVData.
e controlla la mancata corrispondenza tra le dimensioni dell'intestazione e la lettura della riga di dati successiva.

PS.

Ho già fatto tutte queste manipolazioni con la classe, per così dire, finalizzato le piccole cose.

Grazie mille per l'interesse e per le utili raccomandazioni.

Capisco il problema di KohonenMap.InitParameters, è ovviamente un errore.

Naturalmente, la classe finale dovrebbe essere corretta come hai suggerito, sarà molto più bella.

Vi prego di allegare ciò che avete ottenuto, lo sostituiremo nell'articolo.

 

Uno dei migliori articoli su MQL5. E soprattutto in senso pratico.

Grazie!

 
Quantum:

Allegate ciò che avete ottenuto, lo sostituiremo nell'articolo.

allegato. elenco delle modifiche:

1. piccola modifica alla funzione cIntBMP::Show(int aX, int aY, string aBMPFileName, string aObjectName, bool aFromImages=true)

2. nello script principale aggiunto

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

input bool OpenAfterAnaliz=true; // apertura della cartella delle mappe dopo il completamento

Modifiche alla classe CSOM

1. Aggiunta la funzione CSOM::HideChart, che oscura il grafico, la griglia e così via sotto il colore di sfondo
2. Aggiunti i parametri m_chart, m_chart e m_Images. Aggiunti i parametri m_chart, m_wnd, m_x0, m_y0 che indicano su quale grafico e quale finestra visualizzare le mappe.
+ Il prefisso viene preso automaticamente dal nome del file, altrimenti viene assegnato "SOM"
3. Le mappe vengono scritte nella cartella denominata m_sID
4. I nomi dei file bmp vengono assegnati al nome del file. I nomi dei file bmp sono dati dal nome della colonna dei modelli di addestramento.
4. Modificata la funzione CSOM::ShowBMP - le mappe non vengono copiate nella cartella Images, ma rimangono in Files (altrimenti si perde molto tempo)
5. Al posto di CSOM:: NetDevelope, le mappe vengono scritte nella cartella Images. Al posto della funzione CSOM::NetDeinit ora c'è la funzione CSOM::HideBMP
7. CSOM::ReadCSVData: le mappe non vengono copiate nella cartella Images, ma rimangono in Files (altrimenti si perde molto tempo). La funzione CSOM::ReadCSVData è stata riconfigurata in modo da leggere il file in modo che la prima colonna sia quella dei nomi
6. Aggiunto il flag a CSOM:: Train: per la funzione CSOM::Train: per la funzione CSOM::ReadCSVData. Aggiunto il flag alla funzione CSOM::Train per mostrare le mappe intermedie CSOM::Train( bool bShowProgress)
8. Nella funzione CSOM::Train, i dati intermedi vengono visualizzati ogni 2 secondi anziché le iterazioni,
e anche la notifica dell'avanzamento è stata spostata dal log al commento
9. Alcuni nomi di variabili sono stati accorciati e le funzioni sono state ridotte. Alcuni nomi di variabili sono stati abbreviati e le funzioni sono state categorizzate.

Il rendering Bmp rallenta molto il processo. Quindi è meglio non usarlo inutilmente.

Nell'esempio, le mappe sono basate sui dati di ottimizzazione di Expert Advisor.
File: