Discusión sobre el artículo "Distribuciones Estadísticas en MQL5: tomando lo mejor de R" - página 13
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Léelo.
Entendido.
Creo que las pruebas dadas por usted no son del todo correctas. Considero necesario escribir sobre ello, porque las comparaciones de rendimiento no son lo último.
La cuestión es que MKL es cualitativamente diferente de R. Y en casos de comparaciones de rendimiento estas diferencias cualitativas deben tenerse en cuenta siempre que sea posible. R es un intérprete y MKL es un compilador. Esta diferencia cualitativa para los programas industriales es una ventaja para MKL.
Eche un vistazo al código fuente de R (es un código opensource). Allí toda la matemática básica en C/C++ está compilada en el motor. Y la mayoría de los paquetes también están escritos en C++, de lo contrario no puedes esperar los resultados de los cálculos.
Si R fuera un intérprete en funciones básicas/sistema, quedaría 200-500 veces por detrás de MQL5. Hemos probado específicamente el sistema C / C ++ funciones de R, en lugar de construir el procesamiento manual en bucles (donde R se queda atrás por cientos de veces).
En el desarrollo de R, hay una búsqueda constante de "cómo puedo encontrar un paquete para no tener que escribir un bucle for/while/foreach". De hecho, sólo hay un método para hacer cálculos en R, y es pasar cualquier cálculo más o menos masivo a paquetes de terceros.
Pero hay otra diferencia cualitativa, que también es de gran importancia en el funcionamiento industrial de los programas, y en las pruebas no se tuvieron en cuenta estas diferencias, lo que condujo a resultados distorsionados.
La diferencia cualitativa entre R y MKL es que el objeto elemental en MKL es un escalar, a partir del cual se forman objetos más complejos, por ejemplo vectores. Son los vectores los que se introducen en la entrada de las funciones de distribución.
Busque en el catálogo /include/math/stat cientos de funciones vectoriales.
En R, no existe en absoluto el concepto de escalar. El objeto más simple es un vector. R explota este hecho ampliamente y en nuestro ejemplo de comparación de funciones de distribución en código R podemos ver claramente una técnica de programación, específica de R, como es la "vectorización", que no está disponible en MKL. Dado que se trata de una técnica específica de R que acelera los cálculos entre 10 y 100 veces (dependiendo del tamaño de la matriz), el código para R tendría que contener esta misma técnica. El uso de la vectorización es obvio, porque en las pruebas tomamos un vector de entrada y realizamos cálculos sobre él 100 veces, es decir, es una matriz con lo mismo, pero podemos hacer lo que con diferentes columnas.
No hay vectorización ni características modernas en R. El código allí está escrito sin más por juniors de la programación corriente. Sí, son matemáticos decentes, pero son programadores mediocres.
Las GPU en R siguen siendo sólo cuentos de hadas e intentos aislados en los paquetes más raros.
Resumiendo: un texto en R debería escribirse en R utilizando sus capacidades, especialmente en ausencia de sus análogos en MKL.
Simplemente no conoces ni R ni MQL5.
No has mirado las fuentes de R, no conoces las fuentes de MQL5. No has construido compiladores en los últimos 15 años. Pero estás tratando de discutir con aquellos que lo han hecho todo.
Actualmente, la biblioteca estadística MQL5 (excluyendo Alglib, Fuzzy) ya tiene más de 461 funciones: https://www.mql5.com/ru/forum/86386/page222#comment_3867386.
Esto ya cubre bien las funciones estadísticas básicas.
Si has leído el artículo antes, te recomiendo que lo leas de nuevo - ayer publicaron una nueva versión del artículo con un montón de nuevas funciones.
Actualmente, la biblioteca estadística MQL5 (excluyendo Alglib, Fuzzy) ya tiene más de 461 funciones: https://www.mql5.com/ru/forum/86386/page222#comment_3867386.
Esto ya cubre bien las funciones estadísticas básicas.
Recomiendo a los que hayan leído el artículo antes que lo vuelvan a leer - ayer publicaron una nueva versión del artículo con un montón de nuevas funciones.
Todavía no he descubierto cómo enviar un mensaje push a Quantum. Por favor, añade una cosa que puede que ni siquiera esté en R.
Este es un cálculo rápido del intervalo medio al desplazarlo uno a la derecha. Del mismo modo, el cálculo del coeficiente de correlación de Pearson.
Pearson es bastante difícil de calcular, si de frente. Pero hay métodos iterativos de cálculo: K[i] hasta K[i-1].
Es curioso, es la primera vez que encuentro una frase en ruso con una coma después de cada palabra:
¿Por qué no escribes tú mismo la función necesaria?
Mira las fuentes completas de funciones en /include/math/stat y escribe las que faltan.
En R no hay vectorización ni funciones modernas. El código está escrito por programadores normales y corrientes. Sí, son matemáticos decentes, pero son programadores mediocres.
Simplemente no conoces ni R ni MQL5.
No has mirado las fuentes de R, no conoces las fuentes de MQL5. No has construido compiladores en los últimos 15 años. Pero intentas discutir con los que lo han hecho todo.
Yo tengo conocimientos muy modestos de programación, pero no hasta el punto que describes.
De todas formas, entiendo perfectamente que la implementación interna de R en C++ a la que te refieres no tiene nada que ver con el problema de medir la velocidad de ejecución que planteé. Estoy escribiendo sobre la técnica de escribir código en el propio R, y lo que hay dentro es lo que medimos.
Entonces, sobre la vectorización.
Una cadena tiene un aspecto normal en R
Siempre es al menos un cálculo vectorial. Depende del contexto - lo que a y b son.
Además,
dará un vector c, cada elemento del cual es la raíz cuadrada del elemento correspondiente del vector a
En este caso, a no necesariamente tiene que ser un vector, puede ser un objeto más complejo, como una matriz.
En MQL estos son siempre ciclos.
Además, la vectorización en R implica no sólo los objetos en sí, sino:
Y volviendo al sentido de lo que escribí en el post anterior.
No escribo nada sobre la calidad de la implementación de las funciones C++ en absoluto. Al igual que tú, propongo medirlas tal y como son. Pero utilizando herramientas del lenguaje R que están especialmente pensadas para operaciones vectorizadas.
Por ejemplo.
Para todas tus pruebas, forma una matriz M con 100 (como tú), donde cada columna modele una cita
Entonces en R el mínimo sobre todas las columnas se parece a
El resultado será un vector que contiene el mínimo de cada columna
Usando este patrón, necesitamos medir la tasa de todas las funciones de distribución envueltas en la aplicación apropiada. Hay muchas y son diferentes. No hay análogos en MKL.
Al mismo tiempo, asegúrese de que la biblioteca MKL se instala junto con R.
¿Por qué no escribes tú mismo la función necesaria?
Mira las fuentes de funciones completas en /include/math/stat y escribe las que faltan.
Una idea interesante.
Tal vez puedas encontrar un ejecutor para portar paquetes. Por ejemplo, splines. Tiene mashups de primera calidad, de los de verdad.
Tengo conocimientos muy modestos de programación, pero no hasta el punto que describes.
En cualquier caso, entiendo perfectamente que la implementación interna en C++ de R a la que te refieres no tiene nada que ver con el problema de medir la velocidad de ejecución que he planteado. Estoy escribiendo sobre la técnica de escribir código en el propio R, y lo que hay dentro es lo que medimos.
Entonces, sobre la vectorización.
En R, una cadena parece normal
Siempre es al menos un cálculo de vectorización. Depende del contexto - lo que a y b son.
Además,
dará un vector c, cada elemento del cual es la raíz cuadrada del elemento correspondiente del vector a
En este caso, a no tiene por qué ser un vector, puede ser un objeto más complejo, como una matriz.
En MQL estos son siempre ciclos.
Hemos mostrado cómo trabajar más rápido en bucles. Y en fuentes puras en MQL5 sin usar C++.
Y tambien derrotaremos al vector mas simple sqrt. Aquí hay dos funciones estándar de la biblioteca con un análogo completo de R:
bool MathSqrt(const double &array[],double &result[]) // resultado en un vector separado
Todavía no has entendido que estas 461 funciones de la librería matemática estándar de MQ5 tienen una enorme cobertura de operaciones matemáticas básicas.
Además, la vectorización en R implica no sólo los objetos en sí, sino:
Sí, sí. En teoría.
Y el 99% de todas las operaciones las haces exclusivamente en las funciones más simples sin posibilidad de aceleración.
En MQL5 OpenCL es estándar y puedes acelerar todo sin librerías de terceros. Y en MQL5 ordinario puedes obtener resultados al nivel de C++.
Pero en R, la única opción es buscar un paquete para acelerar cada ciclo. Sí, exactamente cada ciclo, si es que es algo en cuanto al número de iteraciones.
Y volviendo al sentido de lo que escribí en el post anterior.
Poca gente se da cuenta de esto, pero es probable que al usar MKL haya una sobrecarga fabulosa al mover los datos de entrada de R a matrices regulares en las que MKL trabajará, y luego el resultado tiene que ser movido de nuevo al formato de representación de datos interno de R.
No he investigado esto, pero lógicamente es lo que parece. Lo que significa serios gastos para proporcionar soporte MKL.
En MQL5 no hay tales pérdidas en absoluto, por supuesto. Sólo en OpenCL es necesario copiar datos, pero allí es una simple y plana memcopy.
¿Por qué no escribes tú mismo la función necesaria?
Yo la escribí una vez, pero no la formateé como función matemática.
Mira las fuentes completas de funciones en /include/math/stat y escribe las que faltan.
La cuestión es ponerlas en una biblioteca estándar con peinado científico y de programación, como hace Quantum.
Lo más probable es que sea necesario hacer una comparación de rendimiento con tu solución. Entonces, creo, será posible convencer a poner la bicicleta en la biblioteca mat. Yo mismo no he visto esto en paquetes mat. (no puedo decir para R).
Otro pequeño secreto - por qué MQL5 es tan rápido, especialmente cuando las librerías están completamente en el código fuente.
Nuestro compilador se dedica a una optimización tan profunda y tiene la capacidad de cortar tantas comprobaciones y condiciones que las funciones desaparecen por completo y los bucles se simplifican hasta el extremo. Por supuesto, sólo para la versión x64.
A diferencia del uso de librerías/paquetes (donde ni siquiera se puede optimizar una llamada) por parte de otros sistemas, el compilador MQL5 casi siempre trabaja con el código fuente completo y siempre realiza una optimización global hasta la máxima profundidad. Esto da unos resultados asombrosos.
Por eso es importante para nosotros proporcionar todas las bibliotecas estándar en código fuente. Sabemos que en la final todo estará sobreoptimizado para que puedas ganar a casi todo el mundo en términos de velocidad. E incluso la sobrecarga del lenguaje gestionado ya no afectará tanto.