Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 3259

 
Forester #:

Судя по

Посчитана матрица 100*100 а не 15000*15000
15000 * 100 * 4 bytes / 1024 / 1024 ≈ 5.72 MB
 
mytarmailS #:
Вам нужен инструмент который может считать матрицу вне памяти
Это главный приоритет, а не скорость подсчета в памяти. 
Потому что если оперативки не хватит(а её не хватит) то какая разница с какой скоростью матрица считаеться

Пока не вижу технического препятствия считать матрицу миллион на миллион на простой домашней машине. Но сравнение NumPy vs MQL5 для меня имеет большое значение.

 
Aleksey Vyazmikin #:
15000 * 100 * 4 bytes / 1024 / 1024 ≈ 5.72 MB

Это входная матрица.
Выходная будет 15000 сткрок к каждой из 15000 строк. Как во всех др. примерах примерно по 1,7 Гг (если в Double по 8 байт)

 
Forester #:

Это входная матрица.
Выходная будет 15000 сткрок к каждой из 15000 строк. Как во всех др. примерах примерно по 1,7 Гг (если в Double по 8 байт)

Согласен, что не так считает.

 
fxsaber #:

Пока не вижу технического препятствия считать матрицу миллион на миллион на простой домашней машине. Но сравнение NumPy vs MQL5 для меня имеет большое значение.

  Уверены?


Например, входная матрица с 50 000 столбцов/100 строк даст корреляционную матрицу размером 50 000 x 50 000 x 8 байт / (1024 x 1024 x 1024) = 18,63 ГБ

 
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()) < 1e-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)));
}


Полное совпадение значений вычислений NumPy c MQL5.

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

Это входная матрица.
Выходная будет 15000 сткрок к каждой из 15000 строк. Как во всех др. примерах примерно по 1,7 Гг (если в Double по 8 байт)

В общем, увы, питон не умеет с int работать - переводит в double судя по всему.

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 #:

В общем, увы, питон не умеет с int работать - переводит в double судя по всему.

Хватит фигню спамить. Корреляция в интах не считается.

 
Maxim Dmitrievsky #:

Хватит фигню спамить. Корреляция в интах не считается.

Америку не надо открывать. Не принято считать, но подумать, как это можно сделать - стоит.

 
Aleksey Vyazmikin #:

Америку не надо открывать. Не принято считать, но подумать, как это можно сделать - стоит.

в новой ветке придумывайте

Причина обращения: