Aprendizaje automático en el trading: teoría, práctica, operaciones y más - página 3260

 
fxsaber #:

Hasta ahora, no veo ningún obstáculo técnico para calcular una matriz de millón por millón en una simple máquina doméstica. Pero la comparación de NumPy vs MQL5 es muy importante para mí.

¿Estás seguro?


Por ejemplo, una matriz de entrada con 50.000 columnas/100 filas dará una matriz de correlación de 50 .000 x 50. 000 x 8 bytes / (1024 x 1024 x 1024) = 18,63 GB

 
input int inRows = 100; // Длина строки
input int inCols = 15000; // Количество строк

bool IsEqual( matrix<double> &Matrix1, const matrix<double> &Matrix2 )
{
  Matrix1 -= Matrix2;  
  
  const bool Res = (MathAbs(Matrix1.Mean()) < 1 e-15);
  
  Matrix1 += Matrix2;
  
  return(Res);
}

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

void OnStart()
{  
  double Array[];  
  Print(FileLoad("qwe\\arr.csv", Array)); // RAM-drive. https://www.mql5.com/ru/forum/86386/page3258#comment_49549438
  
  matrix<double> Matrix;  
  Matrix.Assign(Array);
  Matrix.Init(inCols, inRows);
  Matrix = Matrix.Transpose();
  
  ArrayFree(Array);  
  Print(FileLoad("qwe\\matr.csv", Array)); // RAM-drive. https://www.mql5.com/ru/forum/86386/page3258#comment_49549438

  matrix<double> Matrix2;
  Matrix2.Assign(Array);
  Matrix2.Init(inCols, inCols);
  Matrix2 = Matrix2.Transpose();
    
  ArrayFree(Array);
  
  matrix<double> Matrix1 = CorrMatrix(Matrix); // https://www.mql5.com/ru/forum/86386/page3256#comment_49538685

  Print(TOSTRING(IsEqual(Matrix1, Matrix2)));
}


Coincidencia total de los valores de cálculo de NumPy con MQL5.

1500000
225000000
IsEqual(Matrix1, Matrix2) = true 
 
Forester #:

Esta es la matriz de entrada.
La salida será de 15000 golpes a cada una de las 15000 filas. Como en todos los otros ejemplos alrededor de 1.7 Gg cada uno (si en Doble por 8 bytes)

En general, por desgracia, python no sabe cómo trabajar con int - lo convierte en doble aparentemente.

import numpy as np
import time

def calc_corr_matrix():
    arr = np.random.randint(1, 101, size=(15000,100), dtype=np.int32)
    corr_matrix = np.corrcoef(arr)
    size_in_mb = corr_matrix.nbytes / 1024**2
    print("Array size:", size_in_mb, "MB")
    return corr_matrix

np.random.seed(123)

start_time = time.time()
corr_matrix = calc_corr_matrix()
end_time = time.time()

print("Time taken:", end_time - start_time, "seconds")
Array size: 1716.61376953125 MB
Time taken: 4.62926459312439 seconds
 
Aleksey Vyazmikin #:

En general, por desgracia, python no sabe cómo trabajar con int - lo convierte a double, aparentemente.

Deja de spam basura. La correlación en ints no cuenta.

 
Maxim Dmitrievsky #:

Deja de decir chorradas. La correlación en ints no cuenta.

No es necesario abrir América. No es común contar, pero vale la pena pensar en cómo se puede hacer.

 
Aleksey Vyazmikin #:

Estados Unidos no necesita ser descubierto. No es común considerarlo, pero vale la pena pensar en cómo puede hacerse.

En un nuevo hilo, piense en algo

 
Maxim Dmitrievsky #:

en el nuevo hilo, proponga

Vaya panda de gente - voy a perder el tiempo por él y es un maleducado.

Qué coño...

 
Aleksey Vyazmikin #:

Estados Unidos no necesita ser descubierto. No es común considerarlo, pero merece la pena pensar en cómo puede hacerse.

Ya he descrito la manera - tomar Alglib f-iys (hay 8 piezas llamadas de PearsonCorrM) y cambiar los tipos de datos. Incluso en 1 byte uchar. Ints de 4 bytes no dará mucha ganancia.
Hazlo por ti mismo si lo necesitas.
 
Aleksey Vyazmikin #:

Voy y pierdo el tiempo por él y es un maleducado.

A la mierda.

No te pedí que perdieras el tiempo por mí.

 
En muchos casos se puede reducir la matriz eliminando las filas vecinas, que casi siempre están muy correlacionadas. Por un factor de 5 como mínimo.
Razón de la queja: