Ticarette makine öğrenimi: teori, pratik, ticaret ve daha fazlası - sayfa 3279

 
Alexander Ivanov #:
ve korkmuyorum.

Ve bu doğru.

 
Grigori.S.B #:

Ve haklı olarak.

Gerçek dünyadan üzücü haberler gelecek.

 

Uzun bir dize içinde benzer kısa dizeleri hızlı bir şekilde bulmaya çalışıyorum.

Alglib'i en iyi şekilde kullanmak mümkün mü?

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


Sonuç.

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

Alglib ile altı saniyeden fazla bir sürede bu tür bir uygulama milyonuncu dizede benzer kısa dizeleri (300) arar. NumPy bunu yapabilir mi?

 
fxsaber #:

Uzun bir dizide benzer kısa dizeleri hızlı bir şekilde bulmaya çalışmak.

Alglib kullanmak daha mı uygun?


Sonuç.

Alglib aracılığıyla sekiz saniyeden fazla bu tür bir uygulama, kısa dizeye (300) benzer milyonuncu dizede arama yapar. NumPy bunu yapabilir mi?

Peki elde edilen matrisi nasıl değerlendireceksiniz? Böyle bir değerlendirmenin prensibini anlamıyorum.

 
Forester #:
Ve ortaya çıkan 300*1000000 matrisi nasıl değerlendireceksiniz? Böyle bir tahminin prensibini anlamıyorum.

  1. 1 000 000 için bir satır.
  2. 0..299] aralığındaki değerleri alıyoruz ve bunları 300x1000000 matrisinin ilk sütununa yerleştiriyoruz.
  3. 1..300] aralığındaki değerler alınır ve 300x1000000 matrisinin ikinci sütununa yerleştirilir.
  4. Ve böyle devam eder.
Bu matrisin 300'deki bazı desenlerle korelasyonu hesaplanır. Çıktı, karşılık gelen Pearson katsayılarının milyonuncu vektörüdür.
 
fxsaber #:
Bu uygulamanın Alglib 'de kısa bir dizeye benzer bir milyonuncu dizeyi araması altı saniyeden fazla sürüyor.

Ben de ortalama 6 saniye alıyorum.

Birkaç deneme yaptım.

 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 

Ama bunu en olağan şekilde yaptım, herhangi bir roket bilimi çözümü aramadım.

 
mytarmailS #:

Ben de ortalama altı saniye civarındayım.

Birkaç koşu yaptım.

Ama bunu her zamanki gibi yaptım, roket bilimi çözümleri aramadım.

Ne tür bir R programınız var?

Microsoft'un R'si vektörler ve matrisler için Intel'in İncil'ini kullanır....

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

Senin R'n ne?

Microsoft R vektörler ve matrisler için Intel İncil'ini kullanır....

düzenli...

ama fonksiyonu R'de C++ ile yazdım.

 
mytarmailS #:

sıradan

Acaba Microsoft R + intel = ponts mu yoksa gerçekten daha mı hızlı?

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

Acaba Microsoft R + Intel = ponts mu yoksa gerçekten daha mı hızlı?

Hiç denemedim. Ben de merak ediyorum.

Ancak sadece matrisler ve vektörler değil, herhangi bir işlemde genel hız artışı ile ilgileniyorum