Maschinelles Lernen im Handel: Theorie, Modelle, Praxis und Algo-Trading - Seite 3279

 
Alexander Ivanov #:
und ich habe keine Angst.

Und das ist richtig so.

 
Grigori.S.B #:

Und das zu Recht.

Es wird eine traurige Nachricht aus der realen Welt sein.

 

Ich versuche, schnell ähnliche kurze Zeichenfolgen in einer langen Zeichenfolge zu finden.

Ist es möglich, Alglib optimal zu nutzen?

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


Ergebnis.

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

Mehr als sechs Sekunden sucht eine solche Implementierung über Alglib nach ähnlichen kurzen Zeichenketten (300) in der millionsten Zeichenkette. Kann NumPy das auch?

 
fxsaber #:

Schnelles Auffinden ähnlicher kurzer Zeichenfolgen in einer langen Zeichenfolge.

Ist es optimaler, Alglib zu verwenden?


Ergebnis.

Mehr als acht Sekunden solche Implementierung durch Alglib sucht in der millionsten Zeichenfolge ähnlich der kurzen Zeichenfolge (300). NumPy kann das auch?

Und wie werden Sie die erhaltene Matrix auswerten? Ich verstehe das Prinzip einer solchen Auswertung nicht.

 
Forester #:
Und wie werden Sie die resultierende 300*1000000-Matrix auswerten? Ich verstehe das Prinzip einer solchen Schätzung nicht.

  1. Eine Zeile für 1 000 000.
  2. Wir nehmen Werte im Intervall [0..299] und tragen sie in die erste Spalte der 300x1000000 Matrix ein.
  3. Die Werte im Intervall [1..300] werden genommen und in die zweite Spalte der 300x1000000-Matrix eingetragen.
  4. Und so weiter.
Die Korrelation dieser Matrix mit einem Muster bei 300 wird berechnet. Die Ausgabe ist der millionste Vektor der entsprechenden Pearson-Koeffizienten.
 
fxsaber #:
Diese Implementierung benötigt mehr als sechs Sekunden, um Alglib nach einer millionsten Zeichenkette zu durchsuchen, die einer kurzen Zeichenkette ähnelt.

Ich brauche im Durchschnitt auch etwa 6 Sekunden.

Ich habe mehrere Durchläufe gemacht.

 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 

aber ich habe es auf die übliche Art und Weise gemacht, ich habe nicht nach irgendwelchen raketenwissenschaftlichen Lösungen gesucht.

 
mytarmailS #:

Ich habe auch einen Durchschnitt von etwa sechs Sekunden.

Ich habe ein paar Läufe gemacht

aber ich habe es auf die übliche Weise gemacht, ich habe nicht nach irgendwelchen raketenwissenschaftlichen Lösungen gesucht.

Welche Art von R haben Sie?

Microsofts R verwendet die Intel-Bibel für Vektoren und Matrizen....

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

Was ist Ihr R?

Microsoft R verwendet die Intel-Bibel für Vektoren und Matrizen....

regelmäßig...

aber ich habe die Funktion in C++ in R geschrieben.

 
mytarmailS #:

normal

Ich frage mich, ob Microsoft R + intel = ponts oder wirklich schneller?

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

Ich frage mich, ob Microsoft R + Intel = ponts oder wirklich schneller?

Ich habe es nie ausprobiert, aber ich bin auch neugierig.

Aber ich interessiere mich für allgemeine Geschwindigkeitssteigerung bei allen Aktionen, nicht nur Matrizen und Vektoren