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

 

Intento encontrar rápidamente cadenas cortas similares en una cadena larga.

¿Es posible utilizar Alglib de forma óptima?

#include <Math\Alglib\statistics.mqh> // https://www.mql5.com/ru/code/11077

const vector<double> GetCorr( const CMatrixDouble &Matrix, const vector<double> &Pattern )
{
  CMatrixDouble Vector;
  CMatrixDouble Corr;
  
  Vector.Col(0, Pattern);

  CBaseStat::PearsonCorrM2(Vector, Matrix, Matrix.Rows(), 1, Matrix.Cols(), Corr);
  
  return(Corr.Row(0));
}

#property script_show_inputs

input int inRows = 300; // Длина короткой строки
input int inCols = 1000000; // Длина длинной строки

void FillArray( double &Array[], const int Amount )
{
  for (uint i = ArrayResize(Array, Amount); (bool)i--;)
    Array[i] = MathRand();
}

void FillMatrix( CMatrixDouble &Matrix, const double &Array[], const int Rows )
{
  Matrix.Resize(Rows, ArraySize(Array) + 1 - Rows);

  double ColArray[];
  vector<double> Vector;
  
  for (uint i = (uint)Matrix.Cols(); (bool)i--;)
  {
    ArrayCopy(ColArray, Array, 0, i, Rows);
    Vector.Swap(ColArray);
    
    Matrix.Col(i, Vector);
  }
}

void FillData( double &Array[], double &Pattern[], CMatrixDouble &Matrix, const int Rows, const int Cols )
{
  FillArray(Array, Cols + Rows - 1);
  FillArray(Pattern, Rows);

  FillMatrix(Matrix, Array, Rows);    
}

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

// Поиск похожей строки в длинной строке.
void OnStart()
{  
  if (inRows < inCols)
  {
    PrintCPU(); // https://www.mql5.com/ru/forum/86386/page3256#comment_49538685
    
    double Array[]; // Длинная строка, где будет искать.
    double Pattern[]; // Короткая строка, с которой будем сравнивать.
    CMatrixDouble Matrix;
    
    FillData(Array, Pattern, Matrix, inRows, inCols); // Заполнили данные.
            
    Print(TOSTRING(inRows) + TOSTRING(inCols));

    vector<double> vPattern;  
    vPattern.Assign(Pattern);

    ulong StartTime, StartMemory; // https://www.mql5.com/ru/forum/86386/page3256#comment_49538685

    BENCH(vector<double> Vector1 = GetCorr(Matrix, vPattern))
//    BENCH(vector<double> Vector2 = GetCorr(Array, Pattern))
  
//    Print(TOSTRING(IsEqual(Vector1, Vector2)));
  }      
}


Resultado.

EX5: 4000 AVX Release.
TerminalInfoString(TERMINAL_CPU_NAME) = Intel Core i7-2700 K  @ 3.50 GHz 
TerminalInfoInteger(TERMINAL_CPU_CORES) = 8 
TerminalInfoString(TERMINAL_CPU_ARCHITECTURE) = AVX 
inRows = 300 inCols = 1000000 
vector<double> Vector1 = GetCorr(Matrix, vPattern) - 6725703 mcs, 8 MB

Más de seis segundos tal implementación mediante Alglib busca cadenas cortas similares (300) en la cadena millonésima. ¿NumPy puede hacerlo?

 
fxsaber #:

Intentar encontrar rápidamente cadenas cortas similares en una cadena larga.

¿Es más óptimo utilizar Alglib?


Resultado.

Más de ocho segundos tal implementación a través de Alglib busca en la millonésima cadena similar a la cadena corta (300). ¿NumPy puede hacerlo?

¿Y cómo evaluará la matriz obtenida? No entiendo el principio de tal evaluación.

 
Forester #:
¿Y cómo va a evaluar la matriz 300*1000000 resultante? No entiendo el principio de tal estimación.

  1. Una fila para 1 000 000.
  2. Tomamos valores en el intervalo [0..299] y los colocamos en la primera columna de la matriz 300x1000000.
  3. Se toman valores en el intervalo [1..300] y se colocan en la segunda columna de la matriz 300x1000000.
  4. Y así sucesivamente.
Se calcula la correlación de esta matriz con algún patrón a 300. La salida es el millonésimo vector de los coeficientes de Pearson correspondientes.
 
fxsaber #:
Esta implementación tarda más de seis segundos en buscar en Alglib una millonésima cadena similar a una cadena corta .

Yo también tardo una media de 6 segundos.

He hecho varias ejecuciones.

 system.time({
+   find_cor(y,x)
+ })
   user  system elapsed 
   4.15    0.03    5.70 
> system.time({
+   find_cor(y,x)
+ })
   user  system elapsed 
   4.38    0.02    5.16 
> system.time({
+   find_cor(y,x)
+ })
   user  system elapsed 
   4.18    0.01    6.10 
> system.time({
+   find_cor(y,x)
+ })
   user  system elapsed 
   4.08    0.00    5.99 

pero lo hice de la forma más habitual, no busqué ninguna solución de ciencia espacial.

 
mytarmailS #:

Yo también estoy promediando unos seis segundos.

He hecho algunas carreras

pero lo hice de la manera habitual, no busqué ninguna solución de ciencia espacial.

¿Qué tipo de R tienes?

R de Microsoft utiliza la biblia de Intel para vectores y matrices....

 
СанСаныч Фоменко #:

¿Cuál es tu R?

Microsoft R utiliza la biblia de Intel para vectores y matrices....

regular...

pero escribí la función en C++ en R.

 
mytarmailS #:

ordinario

Me pregunto si Microsoft R + intel = ponts o realmente más rápido?

 
СанСаныч Фоменко #:

Me pregunto si Microsoft R + Intel = ponts o realmente más rápido?

Nunca lo he probado, también tengo curiosidad.

Pero estoy interesado en el aumento general de la velocidad en cualquier acción, no sólo matrices y vectores

 
mytarmailS #:

Nunca lo he probado, yo también tengo curiosidad.

Pero estoy interesado en el aumento general de la velocidad en cualquier acción, no sólo la matriz y el vector.

aumentar el tamaño de la memoria por cualquiera de las formas conocidas

incluyendo intentar usar la zona de sombra de RAM plus (bajo BIOS)

aumentar la tasa de bits del procesador

aumentar la velocidad de acceso al disco duro (como opción, asignar una parte de la RAM para el archivo con los datos procesados, es decir, hacer un disco duro virtual)

coordinar todo el hardware del ordenador por la frecuencia del bus de datos

utilizar el procesamiento de tareas en varios hilos paralelos

 
fxsaber #:

Intentar encontrar rápidamente cadenas cortas similares en una cadena larga.

¿Es más óptimo utilizar Alglib?

Tiene QCF