Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 3269

 
mytarmailS #:
Então, qual é o objetivo final de toda essa correlação?

Bem, você descobriu qual implementação é mais rápida, qual dá resultados idênticos, qual não dá... O que você vai fazer com esse conhecimento?

Eu poderei calcular o que os outros não podem devido a limitações técnicas.

 
mytarmailS #:
Também testes, visualização e ação rápida, provavelmente

A otimização final também é normal, para pegar parâmetros de negócios

 
fxsaber #:

No início, tentei fazer a variante frontal - contar todas as linhas a cada vez. Tive a impressão de que há algum erro no Alglib, pois não consegui encontrá-lo no meu próprio.


O resultado geralmente coincide.


Mas, em algumas situações, isso não acontece.


Se fosse sempre assim, a culpa seria minha. Mas há algo suspeito acontecendo aqui.

Eu fiz

Print(Matrix1);
Print("------------------");
Print(Matrix2);


A Matrix2 tem as primeiras 5 correspondências e, em seguida, zeros.
Alterei Res.Col(Corr.Row(0), i); para Res.Row(Corr.Row(0), i);

As matrizes ficaram semelhantes, mas ainda assim IsEqual não passa. Alguma outra coisa em algum lugar...
 
Forester #:

Alterado Res.Col(Corr.Row(0), i); para Res.Row(Corr.Row(0), i);

Parece estar errado.

 
Forester #:
Feito

Print(Matrix1);
Print("------------------");
Print(Matrix2);


A Matrix2 tem as primeiras 5 correspondências e, em seguida, zeros.
Alterei Res.Col(Corr.Row(0), i); para Res.Row(Corr.Row(0), i);

As matrizes ficaram semelhantes, mas ainda assim IsEqual não passa. Alguma outra coisa em algum lugar...

Encontrei o problema

Deveria ser assim

for (int i = 0; i < (int)Matrix.Cols(); i++)
{
if (i)
Vector.SwapCols(0, i);

CBaseStat::PearsonCorrM2(Vector, MatrixIn, MatrixIn.Rows(), 1, MatrixIn.Cols(), Corr);

Res.Col(Corr.Row(0), i);
}

 
E o PearsonCorrM2 pode ser acelerado em duas vezes se você contar por triângulo, ou seja, a partir do final. Conte 100 linhas com todos, depois 99 com todos os 0-99, 99 e 100º já contados - você pode simplesmente copiar. ...50ª linha com todos até a 50ª, etc. E não conte com ele mesmo porque =1.

P.S.
Em geral, seu código é bonito e conciso. Eu faria tudo em loops))))
 
Forester #:
E o PearsonCorrM2 pode ser acelerado em duas vezes se você contar por triângulo, ou seja, a partir do final. Conte 100 linhas com todos, depois 99 com todos os 0-99, 99 e 100º já contados - você pode simplesmente copiar. ...50ª linha com todos até a 50ª e assim por diante.
Li em algum lugar que você pode calcular rapidamente a correlação por meio da transformada rápida de Fourier... Também como uma opção para acelerar.
 
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))
correlações = residual_products / sum_products 
 
mytarmailS #:
Li em algum lugar que você pode ler rapidamente a correlação por meio de uma transformada rápida de Fourier... Também como uma opção para acelerar.

Eu já fiz isso. Faz sentido quando o comprimento da cadeia é grande. Vou lhe mostrar um dia desses.

 
Forester #:

Encontrei o problema

Deveria ser assim

Exatamente, obrigado! Não entendo por que a opção errada funcionou com inCols < 100.