Discussão do artigo "Usar Mapas Auto-organizáveis (mapas de Kohonen) no MetaTrader 5"

 

Novo artigo Usar Mapas Auto-organizáveis (mapas de Kohonen) no MetaTrader 5 foi publicado:

Um dos aspectos mais interessantes dos Mapas auto-organizáveis (mapas de Kohonem) é que eles aprendem a classificar os dados sem supervisão. Em seu formato básico, ele produz um mapa de similaridade dos dados de entrada (clustering). Os mapas SOM podem ser usados para a classificação e visualização de dados de alta dimensão. Neste artigo, serão apresentadas diversas aplicações simples dos mapas de Kohonen.


Autor: MetaQuotes Software Corp.

 

Completo e, o mais importante, bonito.

Uma pergunta para Eugene: você copiou a mesma classe (com pequenas alterações) em todos os arquivos SOM_exN?

E a segunda pergunta: eu entendi corretamente que você tem as funções de exibição e cálculo de mapas em uma única classe?

 
sergeev:

Essa é uma pergunta para Eugene - você copiou a mesma classe (com pequenas alterações) em todos os arquivos SOM_exN?

E a segunda pergunta: eu entendi corretamente que você tem as funções de exibição de mapa e cálculos de mapa em uma classe?

Sim, você está certo, a classe é a mesma. Pequenas alterações são causadas pelas especificidades das tarefas resolvidas (dimensionalidade dos dados e métodos de exibição RGB, CMYK). As funções e os cálculos de exibição de mapas são combinados em uma única classe.

A estrutura geral é a seguinte:

//--- carregar o conjunto de treinamento na matriz m_training_sets_array[]
 KohonenMap.LoadData()
//--- treinamento da rede - modificação dos pesos dos nós m_som_nodes[]
 KohonenMap.Train();
//--- formando uma imagem com um mapa - "projetando" o estado dos nós em uma instância da classe cIntBMP
 KohonenMap.Render();
//--- mostrar as legendas no mapa para cada um dos elementos do conjunto de treinamento 
//ou seja, adicionar à figura os identificadores de cada elemento do conjunto de treinamento
 KohonenMap.ShowTrainPatterns();
//--- mostrar a imagem no gráfico
 KohonenMap.ShowBMP();

o cálculo é feito no método Train (em alguns casos, Render e ShowBMP são chamados dentro dele para mostrar o processo de treinamento) e, em seguida, os resultados são "transferidos" para uma imagem bmp que é exibida no método ShowBMP.

A classe cIntBMP foi usada para renderização e exibição.

 
Quantum:

Sim, você está certo, a classe é a mesma. As pequenas alterações se devem às especificidades das tarefas a serem resolvidas (dimensionalidade dos dados e métodos de exibição RGB, CMYK). As funções e os cálculos de exibição de mapas são combinados em uma única classe.

Talvez, para facilitar o trabalho com as classes, devêssemos transformá-las em uma hierarquia... Tenho certeza de que isso reduzirá o código e facilitará a familiarização com ele.

Especialmente quando se trata das mesmas funções idênticas em todos os arquivos.

 
sergeev:

Talvez, para facilitar o trabalho com as classes, devêssemos transformá-las em uma hierarquia? Tenho certeza de que isso reduzirá o código e facilitará a familiarização com ele.

Especialmente quando se trata de as mesmas funções serem as mesmas em todos os arquivos.

A ideia era mostrar aspectos práticos do uso de redes Kohonen.

Metodologicamente, acabou sendo mais conveniente considerar todas as tarefas separadamente. Há uma pequena hierarquia, CSOM->CSomWeb, CSOM->CSomFood (todas elas tridimensionais, como no primeiro exemplo). No caso quadridimensional das íris de Fisher, juntamente com o CSOM, o CSomNode também teve de ser alterado para lidar com os quatro componentes. Em seguida, surgiram os planos de componentes e m_bmp tornou-se uma matriz.

Em seguida, depois de nos recusarmos a exibir dados tridimensionais (RGB) e quadridimensionais (CMYK) específicos e fixos, obtivemos o SOM.mq5, que permite trabalhar com dados de qualquer dimensão. Os dados dos exemplos anteriores foram transferidos para arquivos de um determinado formato, e sua análise é realizada na linguagem dos planos de componentes.

Em essência, precisamos do som.mq5 como ferramenta, e todos os outros exemplos são de natureza tutorial e são apenas ilustrações dos recursos das redes Kohonen.

 

na função CSOM::ReadCSVData

a string está incorreta

// inicialização da rede, 10000 iterações, grade de nós CellsX*CellsY, imagem ImageXSize x ImageYSize
int dimension=ArraySize(stringsarr)-1;
KohonenMap.InitParameters(dimension,10000,CellsX,CellsY,ImageXSize,ImageYSize);
 
sergeev:

na função CSOM::ReadCSVData

string está errado

Se você quer dizer string:

int dimension=ArraySize(stringsarr)-1;

são as especificações do formato do arquivo de dados de entrada - presume-se que a dimensão seja igual ao número de colunas-1.

A última coluna é o nome da string da amostra de treinamento. Por exemplo, em products.csv

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

o primeiro cabeçalho de linha, que contém os nomes dos componentes, irá para a matriz m_som_titles[].

em seguida, os dados (em m_training_sets_array[]) e os títulos (em m_train_titles[]).

 
Não, eu o destaquei em vermelho.
KohonenMap

você tem um objeto dessa classe na própria classe. Aqui.

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

Nesse sentido, do ponto de vista do uso posterior da classe CSOM autônoma, é necessário:

1. Arquivos separados com CSOMNode, classes CSOM e scripts específicos de seu uso

2. Remover os parâmetros de entrada externos da classe CSOM para um script específico.

3. Adicionar todos esses parâmetros na própria classe

public:
    ColorSchemes m_clrSchema; // esquema de gradiente
    int m_maxpict; // número de imagens em uma linha
    bool m_bHexCell; // células hexagonais
    bool m_bShowBorder; // mostrar os limites
    bool m_bShowTitle; // mostrar legendas

4.
Nesse sentido, expanda a função CSOM::Init em 5 parâmetros para inicialização (você pode remover m_dimension, que é definido em ReadCSVData)
Init(int iter, int xc, int yc, int bmpw, int bmph, int maxpic, ColorSchemes clrSchema, bool bhex, bool bborder, bool btitle)

Isso permitirá que você retire a classe CSOM do arquivo Expert Advisor e use-a simplesmente como um include para os projetos necessários

#property script_show_inputs

#include "SOM.mqh"

input string DataFileName="products.csv"; // Nome do arquivo de dados
input int CellsX=30; // Número de nós por X
input int CellsY=30; // Número de nós em Y
input int ImageW=250; // Largura da imagem
input int ImageH=250; // Altura da imagem
input int MaxPictures=4; // máximo de imagens por linha
input bool HexagonalCell=true; // Células hexagonais
input bool ShowBorders=false; // mostrar as bordas das células
input bool ShowTitles=true; // exibir nomes em planos de coordenadas
input ColorSchemes ColorScheme=Blue_Green_Red; // Cores gradientes

//------------------------------------------------------------------ OnStart
void OnStart()
{
  CSOM KohonenMap;
  MathSrand(200);
  // carregar o conjunto de treinamento do arquivo
  if(!KohonenMap.LoadTrainDataFromFile(DataFileName)) { Print("Erro ao carregar dados para treinamento"); return; }
  KohonenMap.Init(10000, CellsX, CellsY, ImageW, ImageH, MaxPictures, ColorScheme, HexagonalCell, ShowBorders, ShowTitles); // inicialização da rede
  KohonenMap.Train(); // treinamento de rede
  KohonenMap.Render(); // geração de imagens de mapas
  KohonenMap.ShowTrainPatterns(); // mostrar legendas no mapa para cada elemento do conjunto de treinamento
  KohonenMap.ShowBMP(); // mostrar a imagem no gráfico
}

E mais uma modificação: por precaução, transforme a função ReadCSVData em um bool também.
e verifique se há incompatibilidade entre as dimensões do cabeçalho e a leitura da próxima linha de dados

PS.

Eu já fiz todas essas manipulações com a classe, por assim dizer, finalizei pequenas coisas.
Mas, ainda assim, sua classe CSOM é simplesmente fantástica. Obrigado.
 
sergeev:

E mais uma modificação - por precaução - torne a função ReadCSVData bool também.
e verifique se há incompatibilidade entre as dimensões do cabeçalho e a leitura da próxima linha de dados

PS.

Já fiz todas essas manipulações com a classe, por assim dizer, finalizei as pequenas coisas.

Muito obrigado por seu interesse e por suas recomendações úteis.

Entendo que o KohonenMap.InitParameters é obviamente um erro.

É claro que a classe final deve ser corrigida como você sugeriu, pois ficará muito mais bonita.

Anexe o que você conseguiu e nós o substituiremos no artigo.

 

Um dos melhores artigos sobre MQL5. E especialmente em um sentido prático.

Muito obrigado!

 
Quantum:

Anexe o que você recebeu e nós o substituiremos no artigo.

lista de alterações anexada:

1. pequena alteração na função cIntBMP::Show(int aX, int aY, string aBMPFileName, string aObjectName, bool aFromImages=true)

2. adicionada ao script principal

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

input bool OpenAfterAnaliz=true; // abrir a pasta do mapa após a conclusão

Alterações na classe CSOM

1. Adicionada a função CSOM::HideChart - ela escurece o gráfico, a grade, etc. sob a cor de fundo
2. Adicionados os parâmetros m_chart, m_wnd, m_x0, m_y0 - indicando em qual gráfico e em qual janela exibir os mapas.
+ prefixo dos nomes de objetos m_sID. O prefixo é automaticamente adotado pelo nome do arquivo, caso contrário, é atribuído a "SOM"
3. Os mapas são gravados na pasta chamada m_sID
4. Os nomes dos arquivos bmp são dados pelo nome da coluna do padrão de treinamento.
4. Função CSOM::ShowBMP alterada - os mapas não são copiados para a pasta Images, mas permanecem em Files (caso contrário, isso consumiria muito tempo)
5. Em vez da função CSOM::NetDeinit , agora existe a função CSOM::HideBMP
7. A função CSOM::ReadCSVData foi reconfigurada para ler o arquivo de modo que a primeira coluna seja a coluna de nomes
6. Adicionado sinalizador à função CSOM::Train para mostrar mapas intermediários CSOM::Train( bool bShowProgress)
8. Na função CSOM::Train, os dados intermediários são exibidos a cada 2 segundos em vez de iterações,
e também a notificação de progresso é movida do registro para o comentário
9. Alguns nomes de variáveis foram encurtados e as funções foram categorizadas.

A renderização de Bmp torna o processo muito mais lento. Portanto, é melhor não usá-la desnecessariamente.

No exemplo, os mapas são baseados nos dados de otimização do Expert Advisor.
Arquivos anexados: