Discussão do artigo "Mais uma vez vamos falar sobre mapas de Kohonen" - página 3

 
A propósito, peguei os outros dados. Novamente, na terceira imagem, há um arco-íris. Suponho que isso ocorra devido à sua interferência no código a partir do qual você escreveu esse artigo. Você escreveu no artigo que fez várias modificações.

Capturas de tela da plataforma de negociação MetaTrader

GBPUSD, H1, 2017.03.01

Alpari International Limited, MetaTrader 5, Demonstração

O que é o arco-íris?

GBPUSD, H1, 2017.03.01, Alpari International Limited, MetaTrader 5, Demonstração


 
Viktor Vasilyuk:
A propósito, peguei os outros dados. Novamente, na terceira imagem, há um arco-íris. Suponho que isso ocorra devido à sua interferência no código a partir do qual você escreveu esse artigo. Você escreveu no documento que fez algumas modificações.



A normalização da aleatoriedade ao inicializar os nós não limita os próprios nós durante o treinamento. Você pode inicializar os nós com unidades, e isso não afetará o resultado.

Mas isso pode afetar a velocidade de obtenção do resultado.

O fato de eu inicializar os nós com valores aleatórios do campo entre o mínimo e o máximo para cada uma das colunas separadamente, apenas acelera a convergência, porque o SOM não precisa conduzir os nós para os campos especificados no início.

Esse processo é organicamente incorporado ao próprio processo de aprendizagem, de modo que não se pode nem dizer que este é o momento em que a grade está dirigindo e este é o momento em que está aprendendo. Dirigir em um determinado campo significa ajustar o nó com um coeficiente de mudança muito grande.

Portanto, fundamentalmente, minha intervenção não mudou nada. Ela apenas acelerou a velocidade de convergência.

Mas se você tiver reclamações sobre esse mecanismo, pode corrigi-lo. Altere a inicialização dos nós ao criar a grade em Include\SOMNode.mqh

//+------------------------------------------------------------------+
//| Inicialização dos parâmetros do nó no limite definido
//+------------------------------------------------------------------+
void CSOMNode::InitNode(int x1,int y1,int x2,int y2,const double &min_values[],const double &max_values[])
  {
//--- definir coordenadas do nó
   m_x1=x1;
   m_y1=y1;
   m_x2=x2;
   m_y2=y2;
//--- cálculo das coordenadas do centro do nó
   m_x=x1+MathAbs((x2-x1))/2;
   m_y=y1+MathAbs((y2-y1))/2;
//--- preparar uma matriz de pesos
   ArrayResize(m_weights,m_dimension);
//--- inicialização dos pesos com valores aleatórios;
   for(int i=0; i<m_dimension; i++) {m_weights[i]=min_values[i]+(max_values[i]-min_values[i])*rand()/32768;}
  };

Coloque rand() não normalizado e ele será exatamente como no algoritmo original. Assim: m_weights[i]=rand();

 

Estou certo em entender que se você criar um arquivo "optim.csv" como este:

i;Title
-0.195;2017.04.04
0.086;2017.04.03
-0.195;2017.03.31
-0.195;2017.03.30
-0.195;2017.03.29
0.086;2017.03.28
-0.195;2017.03.27
-0.195;2017.03.24
0.086;2017.03.23
0.086;2017.03.22

há apenas dois valores:

  • -0.195
  • 0.086

então a execução de "Sample5_SOM_Net_Player" mostrará algo como isto

início 1 início 2

ou seja, a rede Cohen descobriu que o arquivo "optim.csv" tem dois ... Dois o quê? Padrões?


 

Ou seja, se eu quiser estudar duas barras vizinhas - se elas são de alta ou de baixa -, preciso fazer uma descrição dessas sequências, mais ou menos assim:

Dois bares vizinhos

No final, haverá quatro sequências principais ("11", "12", "21", "22") e uma quinta - quando qualquer barra não for nem de alta nem de baixa (o tamanho do corpo da barra é zero).


Em seguida, basta percorrer o número determinado de barras e criar um arquivo "optim.csv" no qual escreverá essas sequências. Você obterá algo como

i;Time
21;2017.04.03
11;2017.03.31
11;2017.03.30
11;2017.03.29
12;2017.03.28
22;2017.03.27
21;2017.03.24
11;2017.03.23
12;2017.03.22

Em seguida, execute "Sample5_SOM_Net_Player". Certo?

 

Você tem dois valores, mas solicitou 250 nós (50x50), portanto, naturalmente, a grade estende os nós por todo o campo de valores intermediários.

Além disso, você inseriu um valor insignificante Time no campo de agrupamento. Se quiser usar o tempo, a estrutura de dados deverá refletir de alguma forma a periodicidade, caso contrário, a grade entenderá como a segunda-feira difere da sexta-feira. Uma representação de tempo como a que você tem é razoável, pelo menos em dados de vários anos, pois eles encontrarão repetições (se você remover os valores do ano, é claro).

Para entender uma ideia simples, a grade de Kohonen coloca os nós na vizinhança de exemplos semelhantes (em termos multivariados). E então tudo se encaixará com a compreensão do trabalho.

 
Nikolay Demko:

Você tem dois valores, mas solicitou 250 nós (50x50), portanto, naturalmente, a grade estende os nós por todo o campo de valores intermediários.

Além disso, você inseriu um valor insignificante Time no campo de agrupamento. Se quiser usar o tempo, a estrutura de dados deverá refletir de alguma forma a periodicidade, caso contrário, a grade entenderá como a segunda-feira difere da sexta-feira. Uma representação de tempo como a que você tem é razoável, pelo menos em dados de vários anos, pois eles encontrarão repetições (se você remover os valores do ano, é claro).

Para entender uma ideia simples, a grade de Kohonen coloca os nós na vizinhança de exemplos semelhantes (em termos multivariados). E então as coisas se encaixarão com a compreensão do funcionamento.


Se eu refizer o arquivo csv neste formato: [tamanho do corpo da vela][dia da semana (1, 2, 3, 4, 5)] e preenchê-lo para, digamos, 100 barras, acabarei com 100 EXEMPLOS no arquivo csv? E quantos nós colocar nesse caso? 3*3?
 
Vladimir Karputov:

Se eu refizer o arquivo csv neste formato: [tamanho do corpo da vela][dia da semana (1, 2, 3, 4, 5)] e preenchê-lo para, digamos, 100 barras, acabarei com 100 EXEMPLOS no arquivo csv? E quantos nós colocar nesse caso? 3*3?


Depende do que você deseja obter, agrupamento ou regressão.

O clustering combinará vários exemplos em um único cluster, então o número de nós deve ser menor que o número de exemplos.

A regressão exigirá mais nós do que exemplos, para cobrir campos em pontos que não estão representados nos exemplos.

Novamente, esse processo não é binário, portanto, não se pode dizer que é um agrupamento, mas sim uma regressão; imagine-o como um espectro multidirecional, quanto mais agrupamento, menos regressão e vice-versa. E no ponto zero, quando o número de nós é igual ao número de exemplos, temos quantidades aproximadamente iguais de agrupamento e regressão.

 
Nikolay Demko:


Depende do fato de você querer clusterização ou regressão.

O clustering combinará vários exemplos em um único cluster, então o número de nós deve ser menor que o número de exemplos.

A regressão exigirá mais nós do que exemplos, para cobrir campos em pontos que não estão representados nos exemplos.


Bem, para simplificar, eu queria obter uma visualização para quatro sequências:

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

Discussão do artigo "Mais uma vez sobre os mapas de Kohonen"

Vladimir Karputov, 2017.04.04 13:49

Ou seja, se eu quiser investigar duas barras vizinhas - se elas são de alta ou de baixa, preciso fazer uma descrição dessas sequências, algo como:

Dois bares vizinhos

No final, haverá quatro sequências principais ("11", "12", "21", "22") e uma quinta - quando qualquer barra não é nem de alta nem de baixa (o tamanho do corpo da barra é zero).


em um determinado número de barras. Ou seja, executo o script em um determinado número de barras e atribuo uma das cinco sequências ("0", "11", "12", "21", "22"). Também atribuo um dia da semana. No final, tenho 100 exemplos de [nome da sequência][dia da semana] para 100 barras.

 
Vladimir Karputov:


Bem, para simplificar, eu queria uma visualização para quatro sequências:


em um determinado número de barras. Ou seja, eu passo o script em um determinado número de barras e atribuo uma das cinco sequências ("0", "11", "12", "21", "22"). Também atribuo um dia da semana. Acabo com 100 exemplos de [nome da sequência][dia da semana] para 100 barras.


Desculpe, mas não entendi. Se você tem uma combinação de condições e as conhece exatamente, por que precisa de uma grade?

Caso contrário, é melhor mostrar na grade o que lhe interessa, por exemplo, a diferença Open[i]-Close[i] em uma coluna e a diferença Open[i+1]-Close[i+1] em outra coluna, e já com base no agrupamento, definir as condições que o agrupamento deve interpretar.

 
Nikolay Demko:


Se você tem uma combinação de condições e sabe exatamente quais são elas, por que precisa de uma grade?

***

  1. As combinações ("0", "11", "12", "21", "22") são apenas um exemplo que dei a você hoje. Não tenho ideia se elas funcionam ou não. É isso que estou perguntando: se eu criar todos os tipos de combinações, como a grade me ajudará? Pensei que essa grade mostraria visualmente (número?) de ocorrências de meus exemplos em determinados grupos (clusters?).
  2. Bem, se eu fizer "... por exemplo, a diferença entre Open[i]-Close[i] em uma coluna e a diferença entre Open[i+1]-Close[i+1] em outra coluna, ..." qual será o retorno? Bem, verei cores diferentes, mas qual delas é qual?