Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 973

 

Olá.

Por favor, ajude-me a entender. Ao verificar o funcionamento de uma matriz simples (atribuindo um valor);

a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

H= 1/(1+exp(-a[0][2]));

a[0][2]=H;

Print(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2])), " H=",H," a[0][2]=",a[0][2]);


Eu recebo o resultado:

2019.09.21 13:21:44.328 2011.01.03 14:54:20 W EURUSD,H4: a[0][2]=91.49999999999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18 W EURUSD,H4: 1/(1+exp(-a[0][2]))=0.7310585786300049 H=1.0 a[0][2]=1.0

Como assim ?

 
im-zvv:

Olá.

Por favor, ajude-me a entender. Ao verificar o funcionamento de uma matriz simples (atribuindo um valor);

a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

H= 1/(1+exp(-a[0][2]));

a[0][2]=H;

Print(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2])), " H=",H," a[0][2]=",a[0][2]);


Eu recebo o resultado:

2019.09.21 13:21:44.328 2011.01.03 14:54:20 W EURUSD,H4: a[0][2]=91.49999999999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18 W EURUSD,H4: 1/(1+exp(-a[0][2]))=0.7310585786300049 H=1.0 a[0][2]=1.0

Como assim ?

Este é um exemplo difícil de reproduzir, mas suspeito que por causa da conversão do tipo você obtém um resultado diferente do que você espera.

Experimente com este código:

void OnStart()
{
   double a;
   int b = 2;
   a = b / 5;     //    a = 0.0
   Print("a = ",a);  
}

então com isto:

void OnStart()
{
   double a;
   int b = 2;
   a = b /(double) 5;     //    a = 0.4
   Print("a = ",a);  
}

и

void OnStart()
{
   double a;
   int b = 2;
   a = b / 5.0;     //  a = 0.4
   Print("a = ",a);  
}

e fazer uma busca no fórum por "números reais", em resumo, a conversão C é um pouco confusa no início ;)

 

Você mostrou um monte de exemplos usando variáveis int.

Minhas variáveis são todas duplas.

Portanto, a conversão das variáveis para o mesmo formato não funcionará.

 
im-zvv:

Você mostrou um monte de exemplos usando variáveis int.

Minhas variáveis são todas duplas.

Portanto, a conversão da variável para o mesmo formato não funcionará.

a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

H= 1/(1+exp(-a[0][2]));

a[0][2]=H;

Print(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2])), " H=",H," a[0][2]=",a[0][2]);


Eu recebo o resultado:

2019.09.21 13:21:44.328 2011.01.03 14:54:20 W EURUSD,H4: a[0][2]=91.49999999999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18 W EURUSD,H4: 1/(1+exp(-a[0][2]))=0.7310585786300049 H=1.0 a[0][2]=1.0

Como assim ?

Você tem constantes inteiras, assim como o próprio exemplo não é reprodutível - nenhum tipo de variável, bem em geral - minha "pilha de exemplos" pode ser calculada sem PC, seu exemplo... me diga o que é e^(-91.49999).

Esqueça. Eu não posso ajudá-lo.

 

É uma pena que "não possa ajudar"...

Não é uma questão de quanto e^(-91.49999). A questão é por que uma variável do tipo duplo = H, está escrita incorretamente

calculado anteriormente número do tipo duplo =0,7310585786300049 , mas está escrito 1,0 (aliás, o dobro).

Se você tentar usar meu código no testador, eu acho que seu MT4 exibirá a mesma coisa.

Se assim for, você simplesmente não pode usar a MQL4 para trabalhar e isso é perigoso!

 
im-zvv:

Que pena... "não posso ajudar"...

Eu ajudei, ajuda não significa fazer isso por mim ou não vou ler de qualquer maneira, e me preocupo com o resultado!

im-zvv:

Se assim for, a MQL4 simplesmente não pode ser usada para o trabalho e é perigosa!

O comportamento da MQL4 / MQL5 no cálculo das expressões matemáticas é o mesmo que em C++. Você pode ir a qualquer fórum C++ com sua pergunta, talvez um recurso o ajude lá

Sua pergunta passou de ajuda/explicar/ensino a discussão da plataforma MT, não gosta, você a recebeu de graça?

... Nos tempos antigos, a falta de compreensão dos processos físicos provocava o pânico nas pessoas, trovões ou terremotos. no início causou pânico e especulação, depois veio a religião ))))

 

Você não deveria ter ficado tão zangado.

Se feri seus sentimentos pessoais, peço sinceramente desculpas.

Não estou discutindo ou julgando o MT4 de forma alguma. Eu simplesmente sugeri que você corra

Eu só me ofereci para executar o código que lhe enviei no testador do MT4 e se todas as variáveis (H,a[0][2])

são definidos como duplos e o resultado é o mesmo que para mim, tenho uma pergunta:

Qual é o problema? Dirigi-o a vocês.

Mais uma vez :Desculpe... "não posso ajudar"...

Adeus.

 
im-zvv:

que todas as variáveis (H,a[0][2])

são definidos como duplos

Mais uma vez - você tem constantes em sua expressão matemática? - meu exemplo também tem constante 5 ... então eu escrevi 5.0 - não é o mesmo para o compilador! e então eu trouxe explicitamente a constante inteira 5 para o tipo duplo ---> para o compilador será o mesmo que o exemplo acima 5.0


Sua pergunta é repetida regularmente no fórum, embora eu possa não ver qual é a sua pergunta - você tem uma "fórmula pesada" e não variáveis óbvias - remover o desnecessário dos exemplos - arrays e expoente - então você verá qual é o problema, embora se você remover tudo o desnecessário, você provavelmente encontrará onde você não conseguiu o que esperava - eu normalmente faço ;)


HH: e o expoente ao poder de menos 91,49 - não é um número muito pequeno? tipo duplo tem grande precisão, mas ao centésimo poder e levando em conta o sinal de menos - na minha opinião, esta expressão perderá precisão, não quero ir ao Google, mas a primeira coisa que percorri neste Wiki

 

Obrigado por sua paciência!

Tentei isto :

A=91.49999999993754;//a[0][2]=91.49999999993754;

Imprimir("A=",A);

H= 1/(1+exp(-A));

//A=H;

Imprimir("1/(1+exp(-A))=",1/(1+exp(-A)), " H=",H," a[0][2]=",a[0][2]);

Resultado:

2019.09.21 16:14:17.691 2011.01.04 22:29:51 W EURUSD,H4: A=91.49999999999999993754

2019.09.21 16:14:17.690 2011.01.04 22:29:50 w EURUSD,H4: 1/(1+exp(-A))=1.0 H=1.0 a[0][2]=0.0

!!!!! Isto mostra que 1/(1+exp(-91.4999999999993754))=1.0 mas se eu o deixar como no código A=H então o cálculo continua no comando Imprimir (

Vou tentar descobrir porque 1/(1+exp(-91.4999999999993754))=1.0.

Por favor, me entendam. Estou ocupado agora com o ajuste e treinamento da rede neural. O código em si é rude e até eu mesmo me confundo nele... :)

Observo que a rede repete erros. E o principal erro está no cálculo do sigmóide. NÃO DEVE SER =1.


 
im-zvv:

Obrigado por sua paciência!

Tentei isto :

A=91.49999999993754;//a[0][2]=91.49999999993754;

Imprimir("A=",A);

H= 1/(1+exp(-A));

//A=H;

Imprimir("1/(1+exp(-A))=",1/(1+exp(-A)), " H=",H," a[0][2]=",a[0][2]);

Resultado:

2019.09.21 16:14:17.691 2011.01.04 22:29:51 W EURUSD,H4: A=91.49999999999999993754

2019.09.21 16:14:17.690 2011.01.04 22:29:50 w EURUSD,H4: 1/(1+exp(-A))=1.0 H=1.0 a[0][2]=0.0

!!!!! Isto mostra que 1/(1+exp(-91.4999999999993754))=1.0 mas se eu o deixar como no código A=H então o cálculo continua no comando Imprimir (

Vou tentar descobrir porque 1/(1+exp(-91.4999999999993754))=1.0.

Por favor, me entendam. Estou ocupado agora com o ajuste e treinamento da rede neural. O código em si é rude e até eu mesmo me confundo nele... :)

Observo que a rede repete erros. E o principal erro está no cálculo do sigmóide. NÃO DEVE SER =1.


Para que você não encontre nada, foi isso que decidi verificar, você tem que procurar onde está o bug ou a imprecisão no código:

void OnStart()
  {
      double a=91.49999999993754;
      Print("1. a = ",a);
      double H= 1/(1+exp(-a));
      a=H;
      Print("2. a = ",a);
      Print("3. H = ",H);
      double e = exp(-91.49999999993754);
      Print("4. e = ",e);
  }

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 4. e = 1.828331349163451e-40

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 3. H = 1.0

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 2. a = 1.0

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 1. a = 91.4999999999993754

e, em seguida, calcular por etapas e desimprimir os resultados, mas na minha opinião no passo 4 a precisão já cairá, meu resultado é o seguinte: 1.82 x 10^(-40) - este é um número muito pequeno e qualquer operação com números tão pequenos no futuro vai perder ainda mais precisão, isto é uma chamada "magia" quando se trabalha com números reais - não perder precisão com números tão pequenos para tentar fazer cálculos em números inteiros ou em dobro, mas sem perder o número mantissa - você precisa multiplicar por 10^40 ... - então, em geral, precisa contar, então vá em frente eu não vou ajudar
Razão: