Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 973

 

Hola.

Por favor, ayúdenme a entender. Al comprobar el funcionamiento de un array simple (asignar un 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]);


Obtengo el resultado:

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

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

¿Cómo es eso?

 
im-zvv:

Hola.

Por favor, ayúdenme a entender. Al comprobar el funcionamiento de un array simple (asignar un 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]);


Obtengo el resultado:

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

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

¿Cómo es eso?

Este es un ejemplo difícil de reproducir, pero sospecho que debido a la conversión de tipos se obtiene un resultado diferente al esperado.

Experimenta con este código:

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

entonces con esto:

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);  
}

y haz una búsqueda en el foro de "números reales", en fin, la conversión C es un poco confusa al principio ;)

 

Has mostrado un montón de ejemplos utilizando variables int.

Mis variables son todas dobles.

Por lo tanto, convertir las variables al mismo formato no funcionará.

 
im-zvv:

Has mostrado un montón de ejemplos utilizando variables int.

Mis variables son todas dobles.

Así que la conversión de la variable al mismo formato no 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]);


Obtengo el resultado:

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

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

¿Cómo es eso?

Usted tiene constantes enteras, así como el ejemplo en sí no es reproducible - sin tipos de variables, bien en general - mi "pila de ejemplos" se puede calcular sin PC, su ejemplo... sólo dime qué es e^(-91,49999).

Vale, olvídalo. No puedo ayudarte.

 

Es una pena que "no pueda ayudar"...

La cuestión no es cuánto e^(-91,49999). La pregunta es por qué una variable de tipo double = H, se escribe incorrectamente

calculado anteriormente número de tipo doble =0,7310585786300049 , pero se escribe 1,0 (por cierto doble).

Si intentas usar mi código en el probador, creo que tu MT4 mostrará lo mismo.

Si es así, simplemente no puedes usar MQL4 para trabajar y es peligroso.

 
im-zvv:

Qué pena... "no puedo ayudar"...

Ayudé, ayudar no significa hacerlo por mí o no lo leeré de todos modos, ¡y me importa el resultado!

im-zvv:

Si es así, el MQL4 simplemente no se puede utilizar para trabajar y es peligroso.

El comportamiento de MQL4 / MQL5 en el cálculo de expresiones matemáticas es el mismo que en C++. Puedes ir a cualquier foro de C++ con tu pregunta, quizás algún activo te ayude allí

Tu pregunta ha pasado de ayuda/explicación/enseñanza a discusión de la plataforma MT, ¿no te gusta, la recibiste gratis?

... En la antigüedad la falta de comprensión de los procesos físicos provocaba el miedo al pánico en la gente, los truenos o los terremotos... al principio causó pánico y especulación, luego vino la religión ))))

 

No deberías haberte enfadado tanto.

Si he herido sus sentimientos personales, le pido sinceras disculpas.

No estoy discutiendo ni juzgando a MT4 en absoluto. Simplemente he sugerido que se ejecute

Acabo de ofrecer ejecutar el código que te envié en el probador de MT4 y si todas las variables (H,a[0][2])

se definen como dobles y el resultado es el mismo que para mí, tengo una pregunta:

¿Cuál es el problema? Me dirigí a ti.

Una vez más: losiento... "no puedo ayudar"...

Adiós.

 
im-zvv:

que todas las variables (H,a[0][2])

se definen como doble

Una vez más, ¿tiene usted constantes en su expresión matemática? - mi ejemplo también tiene constante 5 ... luego escribí 5.0 - ¡para el compilador esto no es lo mismo! y luego llevé explícitamente la constante entera 5 al tipo double ---> para el compilador esto será lo mismo que el ejemplo anterior 5.0


Tu pregunta se repite con regularidad en el foro, aunque puede que no vea cuál es tu pregunta - tienes una "fórmula pesada" y variables no obvias - elimina lo innecesario de los ejemplos - matrices y exponente - entonces verás cuál es el problema, aunque si eliminas todo lo innecesario, lo más probable es que encuentres donde no has conseguido lo que esperabas - yo suelo hacerlo ;)


HH: y el exponente a la potencia de menos 91,49 - no es un número muy pequeño... tipo doble tiene gran precisión, pero a la centésima potencia y teniendo en cuenta el signo menos - en mi opinión, esta expresión perderá precisión, no quiero buscar en Google, pero lo primero que he desplazado a través de este Wiki

 

Gracias por su paciencia.

Probé esto:

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

Print("A=",A);

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

//A=H;

Print("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.49999999993754

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

¡¡¡¡¡!!!!! Esto muestra que 1/(1+exp(-91.499999993754))=1.0 pero si lo dejo como en el código A=H entonces el cálculo continúa en el comando Print (

Intentaré averiguar por qué 1/(1+exp(-91,499999993754))=1,0.

Por favor, entiéndeme. Ahora estoy ocupado con la puesta a punto y el entrenamiento de la red neuronal. El código en sí es tosco y hasta yo mismo me confundo en él... :)

Observo que la red repite los errores. Y el principal error está en el cálculo de la sigmoidea. NO DEBERÍA SER =1.


 
im-zvv:

Gracias por su paciencia.

Probé esto:

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

Print("A=",A);

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

//A=H;

Print("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.49999999993754

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

¡¡¡¡¡!!!!! Esto muestra que 1/(1+exp(-91.499999993754))=1.0 pero si lo dejo como en el código A=H entonces el cálculo continúa en el comando Print (

Intentaré averiguar por qué 1/(1+exp(-91,499999993754))=1,0.

Por favor, entiéndeme. Ahora estoy ocupado con la puesta a punto y el entrenamiento de la red neuronal. El código en sí es tosco y hasta yo mismo me confundo en él... :)

Observo que la red repite los errores. Y el principal error está en el cálculo de la sigmoidea. NO DEBERÍA SER =1.


Así que no vas a encontrar nada, eso es lo que decidí comprobar, tienes que buscar dónde está el error o la inexactitud en el 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.499999993754

y luego calcular por pasos y volver a imprimir los resultados, pero en mi opinión en el paso # 4 la precisión ya caerá, mi resultado es el siguiente82 x 10^(-40) - este es un número muy pequeño y cualquier operación con números tan pequeños en el futuro perderá más precisión, esta es una llamada "magia" cuando se trabaja con números reales - para no perder la precisión con números tan pequeños para tratar de hacer cálculos en números enteros o en el doble, pero sin perder el número de mantisa - es necesario multiplicar por 10^40 ... - a continuación, en general, la necesidad de contar, así que adelante no voy a ayudar