fyords: É claro que não me oponho a discutir as sutilezas das redes neurais neste tópico, mas, originalmente, o artigo foi planejado para iniciantes. Ele omite alguns detalhes, porque esses mesmos detalhes podem confundir um networkista neural novato. É claro que o artigo não especifica vários métodos de treinamento (ajuste) de redes neurais, mas isso não é necessário no estágio inicial. Se você perceber que as redes neurais não são tão difíceis assim, isso não lhe dará uma desculpa para se afastar e dizer "isso é muito difícil e não é para mim". Se você sabe mais, isso é ótimo, mas o artigo provavelmente não é para você.
Até agora, foi a ausência dos detalhes sobre os quais perguntei acima que me deixou, como um manequim comum, em um estado de estupor. Reli o artigo três vezes, mas só encontrei as respostas necessárias no fórum.
fyords: No momento, a segunda parte abordará o trabalho com redes neurais multicamadas. Se você tiver alguma dúvida sobre o conteúdo, escreva-a brevemente.
Apenas uma pergunta é de interesse: como criar um programa de autoaprendizagem que possa dispensar o uso de um otimizador "externo". Se isso for possível neste estágio, é claro.
Após algumas deliberações, decidiu-se escrever a segunda parte do artigo.
No momento, a segunda parte abordará o trabalho com redes neurais multicamadas. Se tiver alguma sugestão sobre o conteúdo, escreva-a brevemente. As ideias que eu conseguir transmitir com meus dedos serão descritas no artigo.
Obrigado.
Gostaria de ver o método de aprendizado gradiente descrito nos dedos.
Eu "presumo ingenuamente" que, entre os falantes nativos de russo, não é comum chamar o processo de aprendizado independente de "ajuste de parâmetros". Da mesma forma, não é aceito chamar a seleção de parâmetros (com a ajuda de processos externos) para qualquer sistema como aprendizado.
Não importa como você chame o ajuste, ele não deixará de ser ajuste.
Otimização, ajuste e aprendizado para redes neurais que lidam com dados não estacionários são sinônimos. Porque todos os três termos significam a mesma coisa: seleção de coeficientes de ponderação para dados históricos passados (amostra de treinamento) a fim de minimizar os erros na saída da rede neural. Se fosse possível alimentar a rede com dados futuros, a situação seria diferente. Mas ainda não se vendem máquinas do tempo em lojas de equipamentos de escritório, portanto, temos que nos adaptar ao passado.
Apenas uma questão é de interesse: como criar um programa de autoaprendizagem que possa dispensar o uso de um otimizador "externo". Se isso for possível neste estágio, é claro.
É simples. O código EA pode conter a própria rede e seu otimizador de pesos, que pode ser iniciado automaticamente quando novos dados chegam. Em redes neurais, na maioria dos casos, estamos nos referindo a essas redes de autoaprendizagem. As redes treinadas externamente, por exemplo, pelo otimizador do testador, são brinquedos.
Pessoal, me ajudem! Eu entendi corretamente que a normalização dos dados de entrada deve ser feita para todo o período de treinamento da rede? Quero dizer, os valores máximo e mínimo de xi devem ser obtidos em todo o período?
net: Pessoal, me ajudem! Eu entendi corretamente que a normalização dos dados de entrada deve ser feita para todo o período de treinamento da rede? Quero dizer, os valores máximo e mínimo de xi devem ser extraídos de todo o período?
Isso é necessário em toda a amostra de treinamento.
//+------------------------------------------------------------------+//|macd-neuro-example.mq5//| Copyright 2012, MetaQuotes Software Corp.//|http://www.mql5.com//+------------------------------------------------------------------+#property copyright "Copyright 2012, MetaQuotes Software Corp."#property link "http://www.mql5.com"#property version "1.00"//+------------------------------------------------------------------+//| Função de inicialização de especialista|//+------------------------------------------------------------------+#define SIZE 1000#include <Trade\Trade.mqh> //conectar a biblioteca para realizar operações comerciais#include <Trade\PositionInfo.mqh> //conectar a biblioteca para obter informações sobre posições#include <Indicators/TimeSeries.mqh>//--- valores dos coeficientes de ponderação inputdouble w0=0.5;
inputdouble w1=0.5;
inputdouble w2=0.5;
inputdouble w3=0.5;
inputdouble w4=0.5;
inputdouble w5=0.5;
inputdouble w6=0.5;
inputdouble w7=0.5;
inputdouble w8=0.5;
inputdouble w9=0.5;
inputdouble w10=0.5;
inputdouble w11=0.5;
inputdouble w12=0.5;
string my_symbol; // variável para armazenar o caracteredouble inputsH[13]; // matriz para armazenar sinais de entradadouble inputsL[13]; // matriz para armazenar sinais de entradaint periods[13]={2,3,5,8,13,21,34,55,89,144,233,377,610};
int B,Ba;
double weight[13]; // matriz para armazenar os coeficientes de pesodouble High[SIZE],Low[SIZE];
CTrade m_Trade; // objeto para realizar operações comerciais
CPositionInfo m_Position; // objeto para informações de posição//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+intOnInit()
{
weight[0]=w0;
weight[1]=w1;
weight[2]=w2;
weight[3]=w3;
weight[4]=w4;
weight[5]=w5;
weight[6]=w6;
weight[7]=w7;
weight[8]=w8;
weight[9]=w9;
weight[10]=w10;
weight[11]=w11;
weight[12]=w12;
my_symbol=Symbol();
B=Bars(my_symbol,0);
//--- retorno 0, inicialização concluídareturn(0);
}
//+------------------------------------------------------------------+//| Função de desinicialização de especialista|//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{ }
//+------------------------------------------------------------------+//| Função de tique de especialista|//+------------------------------------------------------------------+voidOnTick()
{
double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); // melhor oferta para comprardouble Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); // melhor oferta para venda
B=Bars(my_symbol,0);
if(B!=Ba)
{
CiHigh hi;
CiLow li;
hi.Create(_Symbol,_Period);
li.Create(_Symbol,_Period);
hi.GetData(0,SIZE,High);
li.GetData(0,SIZE,Low);
}
Ba=B;
{
for(int i=0; i<13; i++)
{
int HB = ArrayMaximum(High,SIZE-periods[i],periods[i]);
int LB = ArrayMinimum(Low, SIZE-periods[i],periods[i]);
if(Bid>=High[HB]) inputsH[i] =1;
else inputsH[i]=0;
if(Bid<=Low[LB]) inputsL[i]=1;
else inputsL[i]=0;
}
double outH=CalculateNeuron(inputsH,weight);
double outL=CalculateNeuron(inputsL,weight);
//--- se o valor de saída do neurônio for menor que 0if(outL>0)
{
//--- se já houver uma posição para esse caractereif(m_Position.Select(my_symbol))
{
//--- e o tipo dessa posição é Sell, então feche-aif(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);
//--- e se o tipo dessa posição for Buy, então saia.if(m_Position.PositionType()==POSITION_TYPE_BUY) return;
}
//--- se você chegou aqui, não há nenhuma posição, abra-a.
m_Trade.Buy(0.1,my_symbol);
}
//--- se o valor de saída do neurônio for maior ou igual a 0if(outH>0)
{
//--- se já houver uma posição para esse caractereif(m_Position.Select(my_symbol))
{
//--- e o tipo dessa posição é Buy, então feche-aif(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol);
//--- e se o tipo dessa posição for Sell, então saia.if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
}
//--- se você chegou aqui, não há nenhuma posição, abra-a.
m_Trade.Sell(0.1,my_symbol);
}
if(outH>0.0 || outL>0) Print(outH," ",outL);
}
}
//+------------------------------------------------------------------+//|| Função de cálculo do neurônio|//+------------------------------------------------------------------+double CalculateNeuron(double &inputs[],double &w[])
{
//--- variável para armazenar a soma ponderada dos sinais de entradadouble NET=0.0;
//--- no loop pelo número de entradas, obtenha a soma média ponderada das entradasfor(int n=0;n<ArraySize(inputs);n++)
{
NET+=inputs[n]*w[n];
}
//--- multiplicar a soma média ponderada dos inputs pelo fator aditivoreturn(ActivateNeuron(NET));
}
//+------------------------------------------------------------------+//|| Função de ativação do neurônio|//+------------------------------------------------------------------+double ActivateNeuron(double x)
{
//--- variável para armazenar o resultado da função de ativaçãodouble Out;
//--- função tangente hiperbólica
Out=(exp(x)-exp(-x))/(exp(x)+exp(-x));
//--- retorna o valor da função de ativaçãoreturn(Out);
}
//+------------------------------------------------------------------+
Eu escrevi essa coruja. Podemos dizer que se trata de uma rede neural, pois tenho minhas dúvidas.
Coruja para negociação no canal.
O algoritmo é o seguinte: os extremos são tomados para o número de barras Fibo (2,3,5,8,13....). Para cada neurônio comprar, por exemplo, se o preço estiver abaixo ou igual ao preço do extremo BAIXO por um período, o retorno será 1, caso contrário, será 0. Além disso, como no exemplo com o NeuronMACD. Para vender - espelhar o oposto.
Estou aguardando críticas sobre o código e o algoritmo.
Eu escrevi essa coruja. Podemos dizer que é uma rede neural, pois tenho minhas dúvidas.
Coruja para negociação no canal.
O algoritmo é o seguinte: os extremos são tomados para o número de barras Fibo (2,3,5,8,13....). Para cada neurônio comprar, por exemplo, se o preço estiver abaixo ou igual ao preço do extremo BAIXO por um período, o retorno será 1, caso contrário, será 0. Além disso, como no exemplo com o NeuronMACD. Para vender - espelhar o oposto.
Estou aguardando as críticas sobre o código e o algoritmo.
No seu caso, a função de ativação do neurônio pode ser descartada, pois é um freio desnecessário.
return(NET);
Não se trata de uma rede neural, é apenas um perceptron. Você precisa de pelo menos dois perceptrons para uma rede.
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Até agora, foi a ausência dos detalhes sobre os quais perguntei acima que me deixou, como um manequim comum, em um estado de estupor. Reli o artigo três vezes, mas só encontrei as respostas necessárias no fórum.
Após algumas deliberações, decidiu-se escrever a segunda parte do artigo.
No momento, a segunda parte abordará o trabalho com redes neurais multicamadas.
Se tiver alguma sugestão sobre o conteúdo, escreva-a brevemente.
As ideias que eu conseguir transmitir com meus dedos serão descritas no artigo.
Obrigado.
Eu "presumo ingenuamente" que, entre os falantes nativos de russo, não é comum chamar o processo de aprendizado independente de "ajuste de parâmetros". Da mesma forma, não é aceito chamar a seleção de parâmetros (com a ajuda de processos externos) para qualquer sistema como aprendizado.
Não importa como você chame o ajuste, ele não deixará de ser ajuste.
Otimização, ajuste e aprendizado para redes neurais que lidam com dados não estacionários são sinônimos. Porque todos os três termos significam a mesma coisa: seleção de coeficientes de ponderação para dados históricos passados (amostra de treinamento) a fim de minimizar os erros na saída da rede neural. Se fosse possível alimentar a rede com dados futuros, a situação seria diferente. Mas ainda não se vendem máquinas do tempo em lojas de equipamentos de escritório, portanto, temos que nos adaptar ao passado.
Seja qual for o nome que você dê a uma adaptação, ela não deixará de ser uma adaptação.
Apenas uma questão é de interesse: como criar um programa de autoaprendizagem que possa dispensar o uso de um otimizador "externo". Se isso for possível neste estágio, é claro.
É simples. O código EA pode conter a própria rede e seu otimizador de pesos, que pode ser iniciado automaticamente quando novos dados chegam. Em redes neurais, na maioria dos casos, estamos nos referindo a essas redes de autoaprendizagem. As redes treinadas externamente, por exemplo, pelo otimizador do testador, são brinquedos.
Pessoal, me ajudem! Eu entendi corretamente que a normalização dos dados de entrada deve ser feita para todo o período de treinamento da rede? Quero dizer, os valores máximo e mínimo de xi devem ser extraídos de todo o período?
Eu escrevi essa coruja. Podemos dizer que se trata de uma rede neural, pois tenho minhas dúvidas.
Coruja para negociação no canal.
O algoritmo é o seguinte: os extremos são tomados para o número de barras Fibo (2,3,5,8,13....). Para cada neurônio comprar, por exemplo, se o preço estiver abaixo ou igual ao preço do extremo BAIXO por um período, o retorno será 1, caso contrário, será 0. Além disso, como no exemplo com o NeuronMACD. Para vender - espelhar o oposto.
Estou aguardando críticas sobre o código e o algoritmo.
Eu escrevi essa coruja. Podemos dizer que é uma rede neural, pois tenho minhas dúvidas.
Coruja para negociação no canal.
O algoritmo é o seguinte: os extremos são tomados para o número de barras Fibo (2,3,5,8,13....). Para cada neurônio comprar, por exemplo, se o preço estiver abaixo ou igual ao preço do extremo BAIXO por um período, o retorno será 1, caso contrário, será 0. Além disso, como no exemplo com o NeuronMACD. Para vender - espelhar o oposto.
Estou aguardando as críticas sobre o código e o algoritmo.
No seu caso, a Função de Ativação de Neurônios pode ser descartada, um freio desnecessário.