Bibliotecas: ALGLIB - Biblioteca de análisis numérico - página 4

 
Yury Kulikov:

¡Hermoso MQ! Un trabajo serio!

Un ejemplo de uso de la librería es enseñar a la red neuronal MLP la tabla de multiplicar.


:( Me da miedo pensar qué pasará con la nube cuando los usuarios empiecen a usar activamente la librería en sus expertos.
Este sencillo script pesa menos de un megabyte.


Lo mismo pero para RF:

cuenta no tan preciso, debería intentar retocarlo

#include <Math\Alglib\dataanalysis.mqh>
//+------------------------------------------------------------------+
#define _rand(min,max) ((rand()/(double)SHORT_MAX)*((max)-(min))+min)
//+------------------------------------------------------------------+
void OnStart()
{
   CDecisionForest      Trf;
   CDecisionForestShell RFshell;
   CMatrixDouble        PatternsMatrix;
   CDFReport            RF_report;
   int RFinfo;
   double vector[2], out[1];
   
   // preparación de datos
   PatternsMatrix.Resize(100,3);
   int m=0;     // primer patrón
   for(int i=1; i<=10; i++)
      for(int j=1; j<=10; j++)
      {
         PatternsMatrix[m].Set(0,i/10.0);       // entrada 1
         PatternsMatrix[m].Set(1,j/10.0);       // entrada 2
         PatternsMatrix[m].Set(2,(i*j)/100.0);  // objetivo
         m++; //siguiente patrón
      }
   // Creación de RF.
   CDForest::DFBuildRandomDecisionForest(PatternsMatrix,100,2,1,50,0.4,RFinfo,Trf,RF_report);
   Print("Info=",RFinfo,"  Error=",CDForest::DFAvgError(Trf,PatternsMatrix,100));  
   // comprobar la red en datos enteros
   string s="Prueba 1 >> ";
   for(int i=1; i<=10; i++)
   {
      int d1=(int)_rand(1,10), d2=(int)_rand(1,10);
      vector[0]=d1/10.0;
      vector[1]=d2/10.0;
      CDForest::DFProcess(Trf,vector,out);
      s+=(string)d1+"*"+(string)d2+"="+DoubleToString(out[0]*100,0)+" // ";
   }
   Print(s);
   // comprobar la red en datos fraccionados
   s="Prueba 2 >> ";
   for(int i=1; i<=5; i++)
   {
      double d1=NormalizeDouble(_rand(1,10),1), d2=NormalizeDouble(_rand(1,10),1);
      vector[0]=d1/10.0;
      vector[1]=d2/10.0;
       CDForest::DFProcess(Trf,vector,out);
      s+=DoubleToString(d1,1)+"*"+DoubleToString(d2,1)+"="+DoubleToString(out[0]*100,2)+
         "("+DoubleToString(d1*d2,2)+") // ";
   }
   Print(s);
}
2017.09.04 21:43:21.609 RF sample (EURUSD,H1)   Info=1  Error=0.01861400000000001
2017.09.04 21:43:21.610 RF sample (EURUSD,H1)   Тест 1 >> 6*9=55 // 7*3=21 // 6*6=38 // 9*7=65 // 9*9=80 // 8*4=32 // 4*1=6 // 1*8=13 // 4*3=12 // 2*2=5 // 
2017.09.04 21:43:21.610 RF sample (EURUSD,H1)   Тест 2 >> 7.7*5.8=46.64(44.66) // 3.0*3.3=9.70(9.90) // 6.0*9.2=55.32(55.20) // 2.6*6.7=20.08(17.42) // 2.5*4.0=12.54(10.00) // 

PS

CDForest::DFBuildRandomDecisionForest(PatternsMatrix,100,2,1,500,1,RFinfo,Trf,RF_report);

es más preciso, 500 antiguos y r=1, más ajuste y menos ruido.

2017.09.04 22:08:33.227 RF sample (EURUSD,H1)   Info=1  Error=2.02997341158806 e-15
2017.09.04 22:08:33.228 RF sample (EURUSD,H1)   Тест 1 >> 2*2=4 // 2*6=12 // 1*9=9 // 9*1=9 // 4*7=28 // 9*6=54 // 5*6=30 // 5*5=25 // 4*1=4 // 1*4=4 // 
2017.09.04 22:08:33.230 RF sample (EURUSD,H1)   Тест 2 >> 4.0*3.8=16.00(15.20) // 9.6*3.1=30.00(29.76) // 5.5*6.4=36.00(35.20) // 4.0*4.4=16.00(17.60) // 1.6*4.2=8.00(6.72) // 
 
Maxim Dmitrievsky:


Lo mismo para RF:

Considera que no es tan preciso, hay que intentar ajustarlo

PS

esta forma es más precisa, 500 árboles y r=1, más ajuste y menos ruido.

Me pregunto cuántos árboles hay que hacer para que los resultados sean precisos. Y es la tabla de multiplicar más simple, y si hay varias funciones, tenemos que ejecutar a través de RF y no la tabla de multiplicar, entonces la respuesta, obviamente, se parecerá a algo justo de lejos?
 
La biblioteca MQL5 es realmente muy potente, es de hecho cómo llamar a la biblioteca con más detalle
 

Gracias @Rashid Umarov

Recomiendo a todos que vayan a la web, porque este hilo lleva actualizado 3 años, pero la web se sigue actualizando.

 

Hemos hecho una revisión completa de la versión basada en C++ GPL de la biblioteca ALGLIB, liberándola como ALGLIB++. Esto rastrea la última versión de ALGLIB, que está en 3.16.0, a partir de 2019/12. Mucho se ha agregado en los módulos de Optimización e Interpolación desde las versiones anteriores con las que MQL5 está sincronizado (por ejemplo, splines de nube de puntos (!), más métodos de interpolación ponderada de distancia inversa, numerosos métodos de optimización adicionales, etc.).

ALGLIB++ es un derivado de ALGLIB que está siendo usado como una forma intermedia en un proceso de reingeniería/refactorización a largo plazo, en el cual será recodificado en C++ nativo (similar a donde estaba antes de la Versión 3), la capa extra y la duplicación siendo removida en preparación para proveer un soporte más directo para multi-threading, así como pruebas y módulos adicionales y eventualmente un lenguaje de scripting front end.

Las diferentes versiones lingüísticas de ALGLIB se generaron a partir de un núcleo común, con la versión C++ proporcionando soporte limitado (pero no oficial) para el dialecto C90 de C. Esta característica hizo necesario simular, dentro de C, características que de otro modo serían nativas de C++, y luego proporcionar una envoltura C++ sobre esto. En consecuencia, hay dos espacios de nombres separados: alglib_impl, que contiene la versión C, y alglib, que contiene las envolturas C++. ALGLIB++ ha conservado la mayor parte de esta estructura y de la codificación original en la medida de lo posible, pero ha reducido o eliminado gran parte de la infraestructura global como primer paso para su eliminación y sustitución por código C++ nativo multihilo y ha simplificado significativamente la interfaz de las envolturas C++. Como tal, representa una forma intermedia que sirve de puente entre ALGLIB, en sí misma, y la futura biblioteca en la que se está transformando ALGLIB++.


Muchos problemas que llevaron a un crecimiento de la complejidad en ALGLIB, desde (y antes de) las versiones adaptadas por MQL5, se han resuelto, con una simplificación resultante en la estructura y la reducción de la complejidad. En su forma actual, debería resultar más fácil de adaptar a MQL5, por aquellos que actualmente mantienen la versión MQL5 de ALGLIB.

Con la distribución se incluye una reformulación completa del manual de ALGLIB++ a partir del original de ALGLIB C++. Las secciones sobre los paquetes y subpaquetes, sin embargo, son compatibles con ambas versiones de ALGLIB, y tanto el diseño como el contenido deberían adaptarse fácilmente a la versión MQL5. MQL5 se menciona en la sección "Referencias y enlaces relacionados" del manual.


La última versión se puede encontrar en para su futura integración en ALGLIB++. Otras bibliotecas, incluida MKL (que, por cierto, tiene rutinas de redes neuronales), también se están estudiando para su futura integración.

LydiaMarieWilliamson/ALGLIB_cpp
LydiaMarieWilliamson/ALGLIB_cpp
  • LydiaMarieWilliamson
  • github.com
Dismiss Join GitHub today GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together. Sign up Permalink
 
Algunas notas adicionales para los desarrolladores de la versión MQL5 de ALGLIB:

Cuando se adaptó ALGLIB a MQL5, se encontró con dificultades con el "RCOMM" rutinas.

Estas son efectivamente rutinas multi-hilo, donde el cambio de hilo está escrito directamente en el código por:
(1) almacenando en caché variables locales del hilo con cada entrada y salida - ¡y las rutinas de iteración llevan a cabo potencialmente millones y miles de millones de ciclos de llamada/retorno!
(2) implementando la conmutación de hilos saltando fuera de la rutina para "pausar" un evento, y saltando de nuevo a la rutina para "reanudar" después del evento - lo que significa un montón de goto's y múltiples puntos de entrada.
(3) diezmar la estructura de flujo de control de estas rutinas para colocar los puntos de entrada en el nivel superior del cuerpo de la función.

Al adaptar ALGLIB a MQL5 mantuvo el flujo de control de diezmar en su lugar, en realidad el envío de los fragmentos de código en rutinas separadas. Esta solución - como finalmente descubriste - no es mantenible; lo que ha hecho imposible seguir el ritmo de las actualizaciones de ALGLIB. ALGLIB, en sí mismo, se quedó un poco atrás también - sus rutinas RCOMM a veces dejan estructuras y variables huérfanas de versiones anteriores.

En ALGLIB++, la estructura de flujo de control se reintegra: los puntos de entrada saltan de nuevo a la mitad de un bucle u otra estructura de flujo de control donde lo dejaron.
No hay almacenamiento en caché de las variables locales del hilo; por el momento se han hecho estáticas (a costa de la seguridad del hilo - pero el multihilo no es formalmente una parte de ALGLIB GPL).
Como en ALGLIB, esto significa que hay un montón de sentencias goto para hacer todos los saltos hacia adelante y hacia atrás; pero están organizadas de forma más limpia.
Las reparaciones hechas en ALGLIB++, por sí mismas, aceleran las rutinas en un 20-25%, según los resultados de nuestras pruebas.

Hay dos maneras de tratar con esta arquitectura para deshacerse de las sentencias goto y manejar más adecuadamente las variables locales del hilo:
(1) Implementar la conmutación de hilos, lo que significa que las rutinas RCOMM envían mensajes de "evento" (que es lo que las banderas needf, ... algpowerup son en realidad), y la persona que llama tiene que configurar un manejador de eventos para recibir y procesar los mensajes. No estoy seguro si MQL5 puede producir y manejar eventos definidos por el usuario, sin embargo.
(2) Utilice punteros de función para los eventos.
Tenga en cuenta que las rutinas RCOMM pueden estar anidadas; y en algunos casos, pueden retransmitir eventos a su llamador obtenidos de las rutinas RCOMM que ellos mismos llaman.

Los desarrolladores de ALGLIB decidieron no usar punteros de función o multi-threading, cuando implementaron ALGLIB, porque cuando ALGLIB fue lanzado por primera vez no había soporte formal para programación multi-threaded en ningún lenguaje ampliamente distribuido y ampliamente usado, y no todos los lenguajes a los que ALGLIB estaba dirigido tenían el mismo o similar equivalente a los punteros de función de C y C++. Pero MQL5 tiene punteros de función. Si adaptas ALGLIB a MQL5, será mucho más fácil hacerlo desde ALGLIB++, en su lugar, debido a la reintegración de las estructuras de flujo de control.

La solución ideal, sin embargo, es utilizar la conmutación de hilos. Con el tiempo, ya sea punteros de función o de conmutación de hilos se utilizarán en ALGLIB ++, no hemos decidido todavía qué camino tomar.

 
LydiaMW:
Algunas notas adicionales para los desarrolladores de la versión MQL5 de ALGLIB:

Cuando adaptaron ALGLIB a MQL5, se encontraron con dificultades con las rutinas "RCOMM".

Estos son efectivamente rutinas multi-hilo, donde el hilo de conmutación está escrito directamente en el código por:
(1) cacheando variables locales del hilo con cada entrada y salida - ¡y las rutinas de iteración llevan a cabo potencialmente millones y miles de millones de ciclos de llamada/retorno!
(2) implementando la conmutación de hilos saltando fuera de la rutina para "pausar" en un evento, y saltando de nuevo a la rutina para "reanudar" después del evento - lo que significa un montón de goto's y múltiples puntos de entrada.
(3) diezmar la estructura de flujo de control de estas rutinas con el fin de poner los puntos de entrada en el nivel superior en el cuerpo de la función.

Al adaptar ALGLIB a MQL5 mantuvo el flujo de control de diezmar en su lugar, en realidad el envío de los fragmentos de código en rutinas separadas. Esta solución - como finalmente descubriste - no es mantenible; lo que ha hecho imposible seguir el ritmo de las actualizaciones de ALGLIB. ALGLIB, en sí mismo, se quedó un poco atrás también - sus rutinas RCOMM a veces dejan estructuras y variables huérfanas de versiones anteriores.

En ALGLIB++, la estructura de flujo de control se reintegra: los puntos de entrada saltan de nuevo a la mitad de un bucle u otra estructura de flujo de control donde lo dejaron.
No hay almacenamiento en caché de las variables locales del hilo; por el momento se han hecho estáticas (a costa de la seguridad del hilo - pero el multihilo no es formalmente una parte de ALGLIB GPL).
Al igual que ALGLIB, esto significa que hay un montón de sentencias goto para hacer todos los saltos hacia adelante y hacia atrás; pero están organizadas de forma más limpia.
Las reparaciones realizadas en ALGLIB++, por sí mismas, aceleran las rutinas en torno a un 20-25%, según los resultados de nuestras pruebas.

Hay dos maneras de tratar con esta arquitectura para deshacerse de las sentencias goto y manejar más adecuadamente las variables locales del hilo:
(1) Implementar la conmutación de hilos, lo que significa que las rutinas RCOMM envían mensajes de "evento" (que es lo que las banderas needf, ... algpowerup son en realidad), y la persona que llama tiene que configurar un manejador de eventos para recibir y procesar los mensajes. Sin embargo, no estoy seguro si MQL5 puede producir y manejar eventos definidos por el usuario.
(2) Utilice punteros de función para los eventos.
Ten en cuenta que las rutinas RCOMM pueden estar anidadas; y en algunos casos, pueden retransmitir eventos a su llamador obtenidos de las rutinas RCOMM que ellos mismos llaman.

Los desarrolladores de ALGLIB decidieron no usar punteros de función o multi-threading, cuando implementaron ALGLIB, porque cuando ALGLIB fue lanzado por primera vez no había soporte formal para programación multi-threaded en ningún lenguaje ampliamente distribuido y ampliamente usado, y no todos los lenguajes a los que ALGLIB estaba dirigido tenían el mismo o similar equivalente a los punteros de función de C y C++. Pero MQL5 tiene punteros de función. Si adaptas ALGLIB a MQL5, será mucho más fácil hacerlo desde ALGLIB++, en cambio, debido a la reintegración de las estructuras de flujo de control.

La solución ideal, sin embargo, es utilizar la conmutación de hilos. Con el tiempo, ya sea punteros de función o de conmutación de hilos se utilizarán en ALGLIB ++, no hemos decidido todavía qué camino tomar.

Querida Lydia:

Pero su archivo de biblioteca ALGLIB ++ en github todavía está en formato C ++ CPP. No se ha convertido a MQL5 mql. ¿proporcionaría archivo de biblioteca ALGLIB ++ como .mql? Gracias!

 

Estimados desarrolladores, por favor añadan un método para calcular el número conjugado de unnúmero complejo a la estructura compleja ( fuente en SB <Math\Alglib\complex.mqh>).

Mi versión:

   //--- operaciones
   void              Copy(const complex &rhs);
   bool              Eq(const complex &lhs, const complex &rhs);
   bool              NotEq(const complex &lhs, const complex &rhs);
   complex           Add(const complex &lhs, const complex &rhs);
   complex           Sub(const complex &lhs, const complex &rhs);
   complex           Mul(const complex &lhs, const complex &rhs);
   complex           Div(const complex &lhs, const complex &rhs);
   complex           Conjugate(void) const;


................


//+------------------------------------------------------------------+
//| Conjugado|
//+------------------------------------------------------------------+
complex complex::Conjugate(void) const
  {
   complex complex_val(re,-im);
   return complex_val;
  };


Después de la próxima publicación de una nueva compilación, tienes que volver a larevisión anterior. Lo cual es inconveniente.

 
Denis Kirichenko:

Estimados desarrolladores, por favor añadan un método para calcular el número conjugado de unnúmero complejo a la estructura compleja ( fuente en SB <Math\Alglib\complex.mqh>).

Mi versión:


Después de la próxima publicación de una nueva compilación, tienes que volver a larevisión anterior. Lo cual es inconveniente.

Añadido