Discusión sobre el artículo "Utilizar Mapas con Función de Auto-Organización (Mapas Kohonen) en MetaTrader 5"

 

Artículo publicado Utilizar Mapas con Función de Auto-Organización (Mapas Kohonen) en MetaTrader 5:

Uno de los aspectos más interesantes de los Mapas con Función de Auto-Organización (mapas Kohonen o SOM, por sus siglas en inglés) es que aprenden a clasificar datos sin supervisión. En su forma más básica, produce un mapa de similitud de datos de entrada (agrupación). Los mapas SOM se pueden usar para la clasificación y visualizacíon de datos de alta dimensión. En este artículo consideraremos varias aplicaciones sencillas de los mapas Kohonen.

Figura 22. Kohonen map for FOREX market (24 may 2011, European session)

Autor: MetaQuotes Software Corp.

 

Completo y, lo que es más importante, bonito.

Una pregunta para Eugene: ¿ha copiado la misma clase (con pequeños cambios) en todos los archivos SOM_exN?

Y la segunda pregunta: ¿he entendido bien que tiene las funciones de visualización y cálculo de mapas en una sola clase?

 
sergeev:

Una pregunta para Eugene: ¿ha copiado la misma clase (con pequeños cambios) en todos los archivos SOM_exN?

y la segunda pregunta - ¿he entendido bien que tiene las funciones de visualización y cálculo de mapas en una misma clase?

Sí, tiene razón, la clase es la misma. Los cambios menores son causados por las especificidades de las tareas resueltas (dimensionalidad de los datos y métodos de visualización RGB,CMYK). Las funciones de visualización de mapas y los cálculos se combinan en una sola clase.

La estructura general es la siguiente

//--- carga el conjunto de entrenamiento en el array m_training_sets_array[]
 KohonenMap.LoadData()
//--- entrenamiento de la red - modificación de los pesos de los nodos m_som_nodes[]
 KohonenMap.Train();
//--- formando una imagen con un mapa - "proyectando" el estado de los nodos en una instancia de la clase cIntBMP
 KohonenMap.Render();
//--- mostrar los subtítulos en el mapa para cada uno de los elementos del conjunto de entrenamiento 
//es decir, añadir a la figura los identificadores de cada elemento del conjunto de entrenamiento
 KohonenMap.ShowTrainPatterns();
//--- mostrar la imagen en el gráfico
 KohonenMap.ShowBMP();

el cálculo se realiza en el método Train (en algunos casos se llama a Render y ShowBMP dentro de él para mostrar el proceso de entrenamiento), luego los resultados se "transfieren" a una imagen bmp que se muestra en el método ShowBMP.

La clase cIntBMP se utilizó para renderizar y mostrar.

 
Quantum:

Sí, tienes razón, la clase es la misma. Los cambios menores se deben a las especificidades de las tareas a resolver (dimensionalidad de los datos y métodos de visualización RGB,CMYK). Las funciones de visualización del mapa y los cálculos se combinan en una sola clase.

Quizás entonces por comodidad de trabajo con las clases deberíamos cambiarlo a una jerarquía... Estoy seguro que reducirá el código y hará más fácil familiarizarse con él.

Especialmente cuando se trata de las mismas funciones idénticas en todos los archivos.

 
sergeev:

Quizás por comodidad a la hora de trabajar con clases deberíamos cambiarlo por una jerarquía... Seguro que así se reduce el código y es más fácil familiarizarse con él.

Especialmente cuando se trata de que las mismas funciones sean las mismas en todos los archivos.

La idea era mostrar aspectos prácticos del uso de las redes de Kohonen.

Metodológicamente resultó más conveniente considerar todas las tareas por separado. existe una pequeña jerarquía, CSOM->CSomWeb, CSOM->CSomFood (todas ellas tridimensionales, como el primer ejemplo). En el caso tetradimensional de los iris de Fisher, junto con CSOM, también hubo que cambiar CSomNode para manejar los 4 componentes. Entonces aparecieron los planos de componentes y m_bmp se convirtió en un array.

Después, tras negarnos a mostrar datos fijos específicos de 3 dimensiones (RGB) y 4 dimensiones (CMYK), obtuvimos SOM.mq5, que permite trabajar con datos de cualquier dimensión, los datos de los ejemplos anteriores se transfirieron a archivos de un formato determinado, y su análisis se realiza además en el lenguaje de los planos de componentes.

En esencia, necesitamos som.mq5 como herramienta, y todos los demás ejemplos son de carácter tutorial y no son más que ilustraciones de las características de las redes de Kohonen.

 

en la función CSOM::ReadCSVData

la cadena es incorrecta

// inicialización de la red, 10000 iteraciones, rejilla de nodos CellsX*CellsY, imagen ImageXSize x ImageYSize
int dimension=ArraySize(stringsarr)-1;
KohonenMap.InitParameters(dimension,10000,CellsX,CellsY,ImageXSize,ImageYSize);
 
sergeev:

en la función CSOM::ReadCSVData

string está mal

Si te refieres a cadena

int dimension=ArraySize(stringsarr)-1;

se trata del formato específico del fichero de datos de entrada - se supone que la dimensión es igual al número de columnas-1.

La última columna es el nombre de cadena de la muestra de entrenamiento. Por ejemplo, en products.csv

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

la primera línea-cabecera, que contiene los nombres de los componentes, irán al array m_som_titles[].

Luego siguen los datos (en m_training_sets_array[]) y los títulos (en m_train_titles[]).

 
No, lo he resaltado en rojo.
KohonenMap

tienes un objeto de esta clase en la propia clase. Aquí.

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

En este sentido, desde el punto de vista del uso posterior de la clase CSOM independiente es necesario:

1. Archivos separados con CSOMNode, clases CSOM y scripts específicos de su uso.

2. Eliminar los parámetros de entrada externos de la clase CSOM a un script específico.

3. Añadir todos estos parámetros en la propia clase

public:
    ColorSchemes m_clrSchema; // esquema de degradado
    int m_maxpict; // número de imágenes en una fila
    bool m_bHexCell; // células hexagonales
    bool m_bShowBorder; // mostrar límites
    bool m_bShowTitle; // mostrar subtítulos

4.
En este sentido, amplíe la función CSOM::Init en 5 parámetros para la inicialización (puede eliminar m_dimension, que se establece en ReadCSVData).
Init(int iter, int xc, int yc, int bmpw, int bmph, int maxpic, ColorSchemes clrSchema, bool bhex, bool bborder, bool btitle)

Esto le permitirá sacar la clase CSOM del fichero Expert Advisor y utilizarla simplemente como un include a los proyectos necesarios

#property script_show_inputs

#include "SOM.mqh"

input string DataFileName="products.csv"; // Nombre del archivo de datos
input int CellsX=30; // Número de nodos por X
input int CellsY=30; // Número de nodos en Y
input int ImageW=250; // Anchura de la imagen
input int ImageH=250; // Altura de la imagen
input int MaxPictures=4; // máx. imágenes por línea
input bool HexagonalCell=true; // Células hexagonales
input bool ShowBorders=false; // mostrar los bordes de las celdas
input bool ShowTitles=true; // mostrar nombres en planos de coordenadas
input ColorSchemes ColorScheme=Blue_Green_Red; // Colores degradados

//------------------------------------------------------------------ OnStart
void OnStart()
{
  CSOM KohonenMap;
  MathSrand(200);
  // cargar el conjunto de entrenamiento desde el archivo
  if(!KohonenMap.LoadTrainDataFromFile(DataFileName)) { Print("Error al cargar datos para el entrenamiento"); return; }
  KohonenMap.Init(10000, CellsX, CellsY, ImageW, ImageH, MaxPictures, ColorScheme, HexagonalCell, ShowBorders, ShowTitles); // inicialización de la red
  KohonenMap.Train(); // formación de redes
  KohonenMap.Render(); // generación de imágenes de mapa
  KohonenMap.ShowTrainPatterns(); // mostrar leyendas en el mapa para cada elemento del conjunto de entrenamiento
  KohonenMap.ShowBMP(); // mostrar la imagen en el gráfico
}

y una modificación más - por si acaso, haga que la función ReadCSVData sea también un bool.
y compruebe la falta de coincidencia entre las dimensiones de la cabecera y la línea de datos siguiente leída

PS.

Ya he hecho todas estas manipulaciones con la clase, por así decirlo, finalizado pequeñas cosas.
Pero aún así tu clase CSOM es simplemente impresionante. Gracias.
 
sergeev:

y una modificación más - por si acaso - haga que la función ReadCSVData sea también bool.
y compruebe la falta de coincidencia entre las dimensiones de la cabecera y la lectura de la siguiente línea de datos

PD.

Ya he hecho todas estas manipulaciones con la clase, por así decirlo, ultimado las cosillas.

Muchas gracias por su interés y recomendaciones útiles.

Entiendo lo de KohonenMap.InitParameters, evidentemente es un error.

Por supuesto, la clase final debe ser corregido como usted sugirió, será mucho más hermoso.

Por favor, adjunta lo que has conseguido, lo sustituiremos en el artículo.

 

Uno de los mejores artículos sobre MQL5. Y en un sentido práctico sobre todo.

¡Gracias!

 
Quantum:

Por favor, adjunta lo que tengas, lo reemplazaremos en el artículo.

adjunto. lista de cambios:

1. pequeño cambio en la función cIntBMP::Show(int aX, int aY, string aBMPFileName, string aObjectName, bool aFromImages=true)

2. en el script principal añadido

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

input bool OpenAfterAnaliz=true; // abrir la carpeta de mapas una vez finalizado

Cambios en la clase CSOM

1. Añadida la función CSOM::HideChart - atenúa el gráfico, la rejilla, etc. bajo el color de fondo
2. 2. Añadidos los parámetros m_chart, m_wnd, m_x0, m_y0 - que indican en qué gráfico y en qué ventana mostrar los mapas.
+ prefijo de los nombres de los objetos m_sID. El prefijo lo toma automáticamente el nombre del archivo, de lo contrario se le asigna "SOM"
3. Los mapas se escriben en la carpeta llamada m_sID
4. Los nombres de los archivos bmp se asignan a la carpeta "SOM". Los nombres de los archivos bmp vienen dados por el nombre de la columna del patrón de entrenamiento.
4. Cambiada la función CSOM::ShowBMP - los mapas no se copian a la carpeta Images, sino que permanecen en Files (de lo contrario se tarda mucho tiempo)
5. 6. En lugar de la función CSOM::NetDeinit - ahora existe la función CSOM::HideBMP
7. Cambiada la función CSOM: : ReadCSVData. 7. La función CSOM::ReadCSVData ha sido reconfigurada para leer el archivo de forma que la primera columna sea la de los nombres
Se ha añadido una bandera a la función CSOM:: Train para mostrar los mapas intermedios CSOM::Train( bool bShowProgress)
8. En la función CSOM::Train, los datos intermedios se muestran cada 2 segundos en lugar de iteraciones,
y también se traslada la notificación de progreso del log a Comment
9. Algunos nombres de variables se han acortado y las funciones se han categorizado.

El renderizado Bmp ralentiza mucho el proceso. Así que es mejor no utilizarlo innecesariamente.

En el ejemplo, los mapas se basan en los datos de optimización del Asesor Experto.
Archivos adjuntos: