트레이딩의 머신러닝: 이론, 모델, 실전 및 알고리즘 트레이딩 - 페이지 3279

 
Alexander Ivanov #:
두렵지 않아요.

맞습니다.

 
Grigori.S.B #:

그리고 당연히 그렇습니다.

현실 세계에서는 슬픈 소식이 될 것입니다.

 

긴 문자열에서 비슷한 짧은 문자열을 빠르게 찾으려고 합니다.

알글립을 최적으로 사용할 수 있을까요?

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


결과.

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을 통한 이러한 구현은 백만 번째 문자열에서 유사한 짧은 문자열(300개)을 찾는 데 6초 이상 걸립니다. NumPy로 할 수 있을까요?

 
fxsaber #:

긴 문자열에서 비슷한 짧은 문자열을 빠르게 찾으려고 합니다.

Alglib을 사용하는 것이 더 최적인가요?


결과.

짧은 문자열(300)과 유사한 백만 번째 문자열에서 Alglib 검색을 통해 8초 이상 구현되었습니다. NumPy가 할 수 있을까요?

그리고 얻은 행렬을 어떻게 평가할 것인가요? 나는 그러한 평가의 원리를 이해하지 못합니다.

 
Forester #:
결과인 300*1000000 행렬은 어떻게 평가하나요? 나는 그러한 추정의 원리를 이해하지 못합니다.

  1. 1 000 000에 대한 행입니다.
  2. 0..299] 간격의 값을 가져와 300x1000000 행렬의 첫 번째 열에 넣습니다.
  3. 1..300] 간격의 값을 가져와 300x1000000 행렬의 두 번째 열에 배치합니다.
  4. 이런 식으로요.
이 행렬과 300의 어떤 패턴의 상관관계가 계산됩니다. 출력은 해당 피어슨 계수의 백만 번째 벡터입니다.
 
fxsaber #:
이 구현에서는 짧은 문자열과 유사한 백만 번째 문자열을 Alglib에서 검색하는 데 6초 이상이 걸립니다.

저도 평균 6초 정도 걸립니다.

여러 번 실행해봤습니다.

 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 

하지만 가장 일반적인 방법으로 수행했으며 로켓 과학 솔루션을 찾지 않았습니다.

 
mytarmailS #:

저도 평균 6초 정도 걸립니다.

몇 번 실행해봤습니다.

몇 번 해봤지만 로켓 과학 솔루션을 찾지 않고 일반적인 방법으로 했습니다.

어떤 종류의 R을 사용하시나요?

Microsoft의 R은 벡터와 행렬에 대해 인텔의 바이블을 사용합니다....

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

R은 무엇인가요?

Microsoft R은 벡터 및 행렬에 인텔 바이블을 사용합니다....

정규...

하지만 저는 함수를 R에서 C++로 작성했습니다.

 
mytarmailS #:

보통

Microsoft R + 인텔 = 폰트 또는 정말 빠른지 궁금합니다.

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

Microsoft R + 인텔 = 폰트인지 아니면 정말 빠른지 궁금합니다.

나는 그것을 시도한 적이 없습니다. 나도 궁금합니다.

하지만 행렬과 벡터뿐만 아니라 모든 작업의 일반적인 속도 향상에 관심이 있습니다.

사유: