Al principio intenté hacer la variante frontal: contar todas las líneas cada vez. Me dio la impresión de que hay algún error en Alglib, porque no pude encontrarlo en mi propia.
El resultado suele coincidir.
Pero en algunas situaciones, no.
Si siempre fuera así, sería culpa mía. Pero hay algo sospechoso aquí.
Y PearsonCorrM2 se puede acelerar por 2 veces si se cuenta por triángulo.es decir, ir desde el final. Cuenta 100 línea con todos, luego 99 con todos 0-99, 99 y 100 ya contados - puedes simplemente copiar. ...50 línea con todos hasta 50, etc. Y no contar con sí mismo porque =1.
P.S. En general, su código es hermoso y conciso. Yo lo haría todo en loops))))
Forester #: Y PearsonCorrM2 se puede acelerar por 2 veces si se cuenta por triángulo.es decir, ir desde el final. Cuenta la línea 100 con todos, luego la 99 con todos 0-99, 99 y 100 ya contados - puedes simplemente copiar. ...la línea 50 con todos hasta la 50 y así sucesivamente.
He leído en alguna parte que se puede calcular rápidamente la correlación a través de la transformada rápida de Fourier ... También como una opción para acelerar.
mytarmailS #: Leí en alguna parte que se puede leer rápidamente la correlación a través de una transformada rápida de Fourier... También como una opción para acelerar.
Yo lo he hecho. Tiene sentido cuando la longitud de la cadena es grande. Te lo enseñaré algún día.
Al principio intenté hacer la variante frontal: contar todas las líneas cada vez. Me dio la impresión de que hay algún error en Alglib, porque no pude encontrarlo en mi propia.
El resultado suele coincidir.
Pero en algunas situaciones, no.
Si siempre fuera así, sería culpa mía. Pero hay algo sospechoso aquí.
Print(Matriz1);
Print("------------------");
Print(Matriz2);
Matrix2 tiene los 5 primeros coincidentes y luego ceros.
Las matrices se volvieron similares, pero IsEqual sigue sin pasar. Algo más en alguna parte...Cambié Res.Col(Corr.Fila(0), i); por Res.Fila(Corr.Fila(0), i);
Cambiado Res.Col(Corr.Fila(0), i); a Res.Fila(Corr.Fila(0), i);
Parece que está mal.
Hecho
Print(Matriz1);
Print("------------------");
Print(Matriz2);
Matrix2 tiene los 5 primeros coincidentes, luego ceros.
Las matrices se volvieron similares, pero IsEqual sigue sin pasar. Algo más en alguna parte...Cambié Res.Col(Corr.Fila(0), i); por Res.Fila(Corr.Fila(0), i);
Encontrado el problema
Debería ser así
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);
}
P.S.
En general, su código es hermoso y conciso. Yo lo haría todo en loops))))
Y PearsonCorrM2 se puede acelerar por 2 veces si se cuenta por triángulo.es decir, ir desde el final. Cuenta la línea 100 con todos, luego la 99 con todos 0-99, 99 y 100 ya contados - puedes simplemente copiar. ...la línea 50 con todos hasta la 50 y así sucesivamente.
Leí en alguna parte que se puede leer rápidamente la correlación a través de una transformada rápida de Fourier... También como una opción para acelerar.
Yo lo he hecho. Tiene sentido cuando la longitud de la cadena es grande. Te lo enseñaré algún día.
Encontrado el problema
Debería ser así
Foro sobre negociación, sistemas automatizados de negociación y ensayo de estrategias de negociación
Aprendizaje automático en el trading: teoría, modelos, práctica y negociación de algoritmos
Maxim Dmitrievsky, 2023.10.01 10:55 AM
residuales_a = a_mat - a_mat. column_means residuales_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)
correlaciones = productos_residuales / productos_suma
Esto parece ser un cálculo frontal de la matriz de correlaciones.
Cierto, ¡gracias! No entiendo por qué la opción incorrecta trabajó con inCols < 100.
Aparentemente
demasiado. Al azar - la correlación media allí es alrededor de 0, probablemente.