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

 
mytarmailS #:
Где-то Читал что можно быстро считать корреляцию через быстрое преобразование фурье..  Тоже как вариант ускориться

Делал. Там имеет смысл, когда длина строки большая. Как-нибудь покажу.

 
Forester #:

Нашел проблему

Должно быть так

Точно, спасибо! Не понимаю, почему неверный вариант работал с inCols < 100.
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Maxim Dmitrievsky, 2023.10.01 10:55

residuals_a = a_mat - a_mat.column_means residuals_b = b_mat - b_mat.column_means a_residual_sums = residuals_a.column_sums b_residual_sums = residuals_b.column_sums residual_products = dot_product(residuals_a.transpose, residuals_b)

sum_products = sqrt(dot_product(a_residual_sums, b_residual_sums))


correlations = residual_products / sum_products

Вроде, это лобовой расчет корреляционной матрицы.

 
fxsaber #:
Точно, спасибо! Не понимаю, почему неверный вариант работал с inCols < 100.

Видимо

Sens = 1e-10
слишком много. Рандом же - там средняя корреляция около 0, наверное.
 
Forester #:

Видимо слишком много. Рандом же - там средняя корреляция около 0, наверное.

Там не средняя ошибка замеряется, а максимальное различие между соответствующими элементами.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

fxsaber, 2023.10.01 09:38

bool IsEqual( matrix<double> &Matrix1, const matrix<double> &Matrix2, const double Sens = 1e-10 )
{
  Matrix1 -= Matrix2;  
  
  const bool Res = (MathMax(MathAbs(Matrix1.Max()), MathAbs(Matrix1.Min())) < Sens);
  
  Matrix1 += Matrix2;
  
  return(Res);
}


Поэтому и непонятно, как при неправильном коде

  for (int i = 0; i < (int)Matrix.Rows(); i++)

получается совпадение.

inRows = 5 inCols = 50 
matrix<double> Matrix1 = CorrMatrix(Matrix) - 242 mcs, 0 MB
matrix<double> Matrix4 = CorrMatrix2(Matrix) - 117 mcs, 0 MB
IsEqual(Matrix1, Matrix4) = true 
 
Forester #:
Ну и PearsonCorrM2 можно ускорить в 2 раза, если считать по треугольнику.Т.е. идти с конца. Посчитать 100 строку со всеми, потом 99 со всеми 0-99, 99 и 100я уже посчитаны - можно просто скопировать. ...50ю строку со всеми до 50й и т.д. Ну и саму с собой не считать т.к. =1.
Боюсь, нет смысла.
inRows = 100 inCols = 15000 
matrix<double> Matrix1 = CorrMatrix(Matrix) - 14196778 mcs, 1717 MB
matrix<double> Matrix4 = CorrMatrix2(Matrix) - 538256223 mcs, 1717 MB
IsEqual(Matrix1, Matrix4) = true 
Жуткий тормоз все равно будет тормозить. Здесь, однозначно, без самоделок не обойтись.
 
fxsaber #:

Поэтому и непонятно, как при неправильном коде

получается совпадение.

Разобрался, если поменять местами расчеты матриц, то получится несовпадение.

inRows = 5 inCols = 50 
matrix<double> Matrix4 = CorrMatrix2(Matrix) - 113 mcs, 0 MB
matrix<double> Matrix1 = CorrMatrix(Matrix) - 214 mcs, 0 MB
IsEqual(Matrix1, Matrix4) = false 

Т.е. мусор из памяти при расчете первой матрицы попадал в новую матрицу и каким-то чудом совпадал с нужным результатом.

 
fxsaber #:

Вроде, это лобовой расчет корреляционной матрицы.

Ну да, если на новых матрицах мкл без циклов сделать, быстрее не будет?
 
fxsaber #:
196

500 сек против 14 - потому мне и запомнилось, что

PearsonCorrM

самая быстрая, за счет алгоритма.

Maxim Dmitrievsky #:
Ну да, если на новых матрицах мкл сделать, быстрее не будет?

Думаю все используемые в PearsonCorrM и PearsonCorrM2 9 функций можно переписать на матрицы и сравнить. В принципе объявления матриц и обращения переписать - на час работы. Заодно узнаем лучше ли матрицы дин. массивов.

Названия
IsFiniteMatrix(
IsFiniteVector(
AblasInternalSplitLength(
AblasSplitLength(
RMatrixGemmK(
RMatrixGemm(
RMatrixSyrk2(
RMatrixSyrk(
RankX(

 
Forester #:

Думаю все используемые в PearsonCorrM и PearsonCorrM2 9 функций можно переписать на матрицы и сравнить. В принципе объявления матриц и обращения переписать - на час работы. Заодно узнаем лучше ли матрицы дин. массивов.

Уже все сделано: MQ переписали их под свои матрицы.

Forester #:

500 сек против 14 - потому мне и запомнилось, что

самая быстрая, за счет алгоритма.

Я там алгоритм не осознал. Самоделка же сильно не отстает только за счет того, что не совершает повторные вычисления.

В NumPy, похоже, иной от ALglib алгоритм, раз сильно разнится по производительности. Но там понятно, что во всем огромном Python-сообществе нашелся какой-то очень сильный алгоритмист, который посвятил изучению данного вопроса приличное количество времени.