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

 
Forester #:
in statistics.mqh.

functions
PearsonCorrM - Tüm satırların tüm satırlarla korelasyonu en hızlısıdır.

Bir yerde yanlış var ama ben göremiyorum.
#include <Math\Alglib\statistics.mqh> 

void OnStart()
{
  const matrix<double> matrix1 = {{1, 2, 3}, {1, 2, 3}, {1, 2, 3}};
  
  const CMatrixDouble Matrix1(matrix1);
  CMatrixDouble Matrix2;
    
  if (CBaseStat::PearsonCorrM(Matrix1, 3, 3, Matrix2))  
    Print(Matrix2.ToMatrix());
}
 
fxsaber #:
Bir yerde yanlışım var ama göremiyorum.

Ama bu dizeyle çalışıyor

const matrix<double> matrix1 = {{2, 2, 3}, {3, 2, 3}, {1, 2, 1}};

[[1,0,0.8660254037844387]
[0,0,0]
[0.8660254037844387,0,1]]

Görünüşe göre, bir sütundaki tüm veriler aynıysa, hesaplama atlanıyor.
2. sütunda tüm verileri 2'de bıraktım ve matrisin 2. satırı sıfır kaldı. Yine de köşegeni 1'lerle doldurmak muhtemelen doğrudur.

NOT. İlk başta bunun Alglib ile ilgili bir hata olduğunu düşündüm.

Eski kodda elemanların değerleri
m[row].Set(col, val);
Ve şimdi
m.Set(row,col, val) aracılığıyla ayarlanıyordu;

Geriye dönük uyumluluğun olmaması üzücü. Benim için önemli değil. Şu anda Alglib ile çalışmıyorum. Birinin eski kodları çalışmayı durdurursa, onu düzeltmek gerekecektir.
En üzücü olan şey, eski sürümün

m[satır].Set(col, val);

hata mesajı yazmaz, sadece hiçbir şey yapmaz. İnsanlar kodu değiştirmeyecek ve değiştirmeleri gerektiğini bilmeyeceklerdir. Bir şeyler sayacaktır, ancak matrisler değişmeden.

 
Forester #:

Görünüşe göre, bir sütundaki tüm veriler aynıysa, hesaplama atlanır.

Pearson satırlar arasında değil de sütunlar arasında mı hesaplama yapıyor?

Öyle görünüyor.
const matrix<double> matrix1 = {{1, 1, 1}, {2, 2, 2}, {3, 3, 3}};
Tek bir matris verir.
 
fxsaber #:

Pearson satırlar arasında değil de sütunlar arasında mı hesaplama yapıyor?

ZY Öyle görünüyor. Bir birim matris üretir.
Bunu transpoze edebilirsiniz.
 

Alglib iyi bir kütüphanedir, MO için her şeye sahiptir. Sinir ağları orada çok yavaş, ilk sürümlerde öyleydi.

 
Forester #:
in statistics.mqh.

PearsonCorrM - Tüm satırların tüm satırlarla korelasyonu en hızlısıdır.

Buna dayanarak korelasyon matrisini hesapladım.

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

const matrix<double> CorrMatrix( const matrix<double> &Matrix )
{
  matrix<double> Res = {};
  
  const CMatrixDouble MatrixIn(Matrix);
  CMatrixDouble MatrixOut;  

  if (CBaseStat::PearsonCorrM(MatrixIn, MatrixIn.Rows(), MatrixIn.Cols(), MatrixOut)) // https://www.mql5.com/ru/code/11077
    Res = MatrixOut.ToMatrix();
  
  return(Res);
}


Performansı ölçtüm.

#property script_show_inputs

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

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

bool IsEqual( matrix<double> &Matrix1, const matrix<double> &Matrix2 )
{
//  return(MathAbs((Matrix1 - Matrix2).Mean()) < 1e-15); // Дорого по памяти.
  
  Matrix1 -= Matrix2;  
  
  const bool Res = (MathAbs(Matrix1.Mean()) < 1 e-15);
  
  Matrix1 += Matrix2;
  
  return(Res);
}

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

#define  BENCH(A)                                                              \
  StartMemory = MQLInfoInteger(MQL_MEMORY_USED);                              \
  StartTime = GetMicrosecondCount();                                          \
  A;                                                                          \
  Print(#A + " - " + (string)(GetMicrosecondCount() - StartTime) + " mcs, " + \
       (string)(MQLInfoInteger(MQL_MEMORY_USED) - StartMemory) + " MB"); 

void PrintCPU()
{
#ifdef _RELEASE
  Print("EX5: " + (string)__MQLBUILD__ + " " + __CPU_ARCHITECTURE__ + " Release.");
#else // #ifdef _RELEASE
  Print("EX5: " + (string)__MQLBUILD__ + " " + __CPU_ARCHITECTURE__ + " Debug.");
#endif // #ifdef _RELEASE #else
  Print(TOSTRING(TerminalInfoString(TERMINAL_CPU_NAME)));
  Print(TOSTRING(TerminalInfoInteger(TERMINAL_CPU_CORES)));
  Print(TOSTRING(TerminalInfoString(TERMINAL_CPU_ARCHITECTURE)));
}

void OnStart()
{  
  PrintCPU();
  
  double Array[];
  FillArray(Array, inRows * inCols);
  
  matrix<double> Matrix;  
  Matrix.Assign(Array);
  Matrix.Init(inCols, inRows);
  Matrix = Matrix.Transpose();
  
  ulong StartTime, StartMemory;
  
  Print(TOSTRING(inRows) + TOSTRING(inCols));

  BENCH(matrix<double> Matrix1 = CorrMatrix(Matrix)) // https://www.mql5.com/ru/code/11077
  BENCH(matrix<double> Matrix2 = Matrix.CorrCoef(false)); // https://www.mql5.com/ru/docs/basis/types/matrix_vector
//  BENCH(matrix<double> Matrix3 = CorrMatrix(Array, inRows)); // https://www.mql5.com/ru/code/17982 

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


Sonuç.

EX5: 3981 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 = 100 inCols = 15000 
matrix<double> Matrix1 = CorrMatrix(Matrix) - 14732702 mcs, 1717 MB
matrix<double> Matrix2 = Matrix.CorrCoef(false) - 40318390 mcs, 1717 MB
IsEqual(Matrix1, Matrix2) = true 


Alglib'in matrisi standart matris yönteminden daha hızlı hesapladığı görülüyor.

Bununla birlikte, örüntü arama için, korelasyon matrisini hesaplamak RAM tüketimi açısından çılgınca.


Python'un yukarıdaki örnekte olduğu gibi aynı boyuttaki orijinal matrisi okuması ne kadar sürer?

 
fxsaber #:

Ancak, kalıpları bulmak için bir korelasyon matrisini okumak RAM tüketen bir çılgınlıktır.

Dahili olanım i7-6700'ümde daha hızlı çalıştı

inRows = 100 inCols = 15000 
matrix<double> Matrix1 = CorrMatrix(Matrix) - 14648864 mcs, 1717 MB
matrix<double> Matrix2 = Matrix.CorrCoef(false) - 29589590 mcs, 1717 MB
IsEqual(Matrix1, Matrix2) = true 

Yerel olanın daha yavaş olması garip, sadece kopyalamış olabilirler. Alglibe'nin lisans altında benzersiz bir hızlandırılmış algoritması olması pek olası değildir.

Alglib'in diğer 2 varyantını denediniz mi?
Döngülerde her satırdan her satıra veya her satırdan tüm satırlara sayarsanız, bellek daha ekonomik olacaktır (2 satır veya 1 satır + matris). Ancak daha uzun sürecektir, tam olarak hatırlamıyorum, ancak yerleşik işlevden daha yavaş olacağını düşünüyorum.

 
fxsaber #:

Ancak, kalıpları bulmak için bir korelasyon matrisini okumak RAM tüketen bir çılgınlıktır.

Hafıza ile daha da kötüleşir.
Başlatmadan önce



Ve Alglibov PearsonCorrM çalışması sırasında bellek her zaman büyüyor: Ekranda 5 gg ve 4.6 gördüm.


ve standart Matrix.CorrCoef çalışması sırasında.

Görünüşe göre, standart olan minimum bellek kullanımı için optimize edilmiş ve Alglibov olanı hız için optimize edilmiş.

 
Forester #:

Dahili olanın daha hızlı çalışmasını sağladım: i7-6700'de.

Koda CPU ve EX5 komut verilerini ekledim.
 
Forester #:

Ve Alglib'in PearsonCorrM programını çalıştırırken, bellek büyümeye devam ediyor: ve 5 gg görüldü, 4,6 ekrana geldi

Bu hat sayesinde tüketim miktarı neredeyse iki katına çıkıyor.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi üzerine forum

Ticarette makine öğrenimi: teori, modeller, uygulama ve algo-ticaret

fxsaber, 2023.09.25 18:01

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

const matrix<double> CorrMatrix( const matrix<double> &Matrix )
{
  matrix<double> Res = {};
  
  const CMatrixDouble MatrixIn(Matrix);
  CMatrixDouble MatrixOut;  

  if (CBaseStat::PearsonCorrM(MatrixIn, MatrixIn.Rows(), MatrixIn.Cols(), MatrixOut)) // https://www.mql5.com/ru/code/11077
    Res = MatrixOut.ToMatrix();
  
  return(Res);
}

Bu sadece CMatrixDouble 'dan matrix<double>'a bir geçiştir. Hatta hafıza nedeniyle bu matris karşılaştırmasını yapmak zorunda kaldım.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi üzerine forum

Ticarette makine öğrenimi: teori, modeller, uygulama ve algo-ticaret

fxsaber, 2023.09.25 18:01

bool IsEqual( matrix<double> &Matrix1, const matrix<double> &Matrix2 )
{
//  return(MathAbs((Matrix1 - Matrix2).Mean()) < 1e-15); // Дорого по памяти.
  
  Matrix1 -= Matrix2;  
  
  const bool Res = (MathAbs(Matrix1.Mean()) < 1 e-15);
  
  Matrix1 += Matrix2;
  
  return(Res);
}