La etiqueta del mercado o los buenos modales en un campo de minas - página 16

 
paralocus писал(а) >>

Neutron, me tomaré un breve descanso. Tengo que repensar todo de nuevo y ponerlo en códigos para al menos una neurona. De todos modos, un día o dos, y luego continuaremos.

Se lo agradezco mucho.

Bien.

 
Neutron >> :

Bien.

Hola Neutrón. Aquí, he hecho algo.

Hice una cuadrícula tan pequeña para el algoritmo ORO:



De hecho, aquí está el código de la rejilla en sí (este es el archivo de cabecera Neyro_test.mqh):

extern int neyrons = 3;
extern int in = 5;

double Data[3][5] = {0.0,0.0,0.0,0.0,1.0,
0.0,0.0,0.0,0.0,1.0,
0.0,0.0,0.0,0.0,1.0 };

double W[4][5] = {-0.786, 0.359,-0.186, 0.891, 0.238,
0.711,-0.923, 0.088, 0.417,-0.112,
-0.867,-0.229, 0.321, 0.921,-0.941,
0.995,-0.712, 0.012,-0.625, 0.0 };

//----------------------------
double OUT(int bar = 1)
{
int i;
double res = 0.0;

GetInd(bar);
res = W[3,0]*RSI_1() + W[3,1]*RSI_2() + W[3,2]*RSI_3() + W[3,3];

return(res);
}

double RSI_1()
{
int i;
double res = 0.0;

for(i = 0; i < 5; i++)
res += W[0,i] * Data[0,i];

return(th(res));
}

double RSI_2()
{
int i;
double res = 0.0;

for(i = 0; i < 5; i++)
res += W[1,i] * Data[0,i];

return(th(res));
}

double RSI_3()
{
int i;
double res = 0.0;

for(i = 0; i < 5; i++)
res += W[2,i] * Data[0,i];

return(th(res));
}

//----------

void OPO(double de)
{
int i;
for(i = 0; i < 4; i++)
W[3,i] += de;
}

//---------------------------------------------------------------------

void GetInd(int i)
{
int dt = 7,per = 14, prc = 0;
double ue_in = 0.02,kf = 3.0;

Data[0,0] = th((iRSI(NULL,0,per,prc,i)*ue_in - 1.0)*kf);
Data[0,1] = th((iRSI(NULL,0,per,prc,i+dt)*ue_in - 1.0)*kf);
Data[0,2] = th((iRSI(NULL,0,per,prc,i+dt*2)*ue_in - 1.0)*kf);
Data[0,3] = th((iRSI(NULL,0,per,prc,i+dt*3)*ue_in - 1.0)*kf);
}
//-------------------------------------------

double th(double x)
{
double sh,ch;
sh = MathExp(x) - MathExp(-x);
ch = MathExp(x) + MathExp(-x);
return(sh/ch);
}



Así es como traté de enseñarlo en un Asesor Experto vacío:

extern int cikl = 10;
static int prevtime = 0;


#include <Neyro_test.mqh>
//-----------------------------------
int init()
{
return(0);
}

int deinit()
{
return(0);
}
//-------------------------------------
int start()
{
static double test, control;

if(Time[0] == prevtime)
return(0);
prevtime = Time[0];

int pr = 14, pc = 0, i;
double in = 0.02, k = 3.0;


for(i = cikl; i > 2; i--)
{
test = OUT(i);
control = th((iRSI(NULL,0,pr,pc,i-1)*in - 1.0)*k);
OPO(test - control);
}

Comment("\r\n ВЕСА ВЫХОДНОГО НЕЙРОНА : ",W[3,0],", ",W[3,1],", ",W[3,2],", ",W[3,3]);
return(0);

}



Básicamente, esta rejilla se "desajusta". Los coeficientes de ponderación se vuelven ridículos después de 10 pasos (barras). He buscado durante mucho tiempo un error en el código y he descubierto que funciona como debería.

Es decir, si nos limitamos a añadir a todos los pesos de la capa de salida un error obtenido en la salida de la red, estos coeficientes tienden a crecer demasiado rápido.

El escalímetro no puede sostener... -:) Hasta ahora sólo he intentado propagar el error a los pesos de la capa de salida.

Primera pregunta: ¿Qué he hecho mal?

Segunda pregunta:

Quiero obtener la probabilidad de éxito de la compra/venta en la salida de la red o una recomendación para fumar bambú. Pero esta parrilla está entrenada para predecir el valor del RSI en n+1 barras...

¿Qué me aporta?

 

en la función ORO, los pesos no se modifican correctamente

Lea la teoría, al menos aquí

 
maxfade >> :

en la función ORO, los pesos no se modifican correctamente

leer la teoría, al menos aquí

Gracias, pero no entiendo nada de eso.

 

el error en la capa de salida debe calcularse mediante la fórmula e=OUT*(1-OUT)*(TEST-OUT) (esto es para la función de transferencia logística, para la tangente hiperbólica la fórmula parece ser un poco diferente, pero tampoco es demasiado complicada)

el peso de la neurona debe modificarse según w+=nju*e*OUT, donde nju es un paso de aprendizaje

si el paso es demasiado grande - la red será inestable y habrá un aumento infinito de pesos (como en tu caso, estás usando (TEST-OUT) sin todos los demás multiplicadores)

Si es demasiado pequeña, la red tardará demasiado en aprender y puede llegar a un mínimo local

 
maxfade >> :

el error en la capa de salida debe calcularse mediante la fórmula e=OUT*(1-OUT)*(TEST-OUT) (esto es para la función de transferencia logística, para la tangente hiperbólica la fórmula parece ser un poco diferente, pero tampoco es demasiado complicada)

el peso de la neurona debe modificarse según w+=nju*e*OUT, donde nju es un paso de aprendizaje

si el paso es demasiado grande - la red será inestable y habrá un aumento infinito de pesos (como en tu caso, estás usando (TEST-OUT) sin todos los demás multiplicadores)

Si es demasiado pequeño, tardará demasiado en aprender y podría llegar a un mínimo local.


Gracias, lo probaré ahora.

 
maxfade >> :

Si el paso es demasiado grande - la red será inestable y habrá un aumento infinito de pesos (como en su caso, se utiliza (TEST-OUT) sin todos los demás multiplicadores)

Si es demasiado pequeño, tardará demasiado en aprender y podría llegar a un mínimo local.


Me confunde un poco el hecho de que la modificación hace que la "posición relativa" de los pesos no cambie. Esto se debe a que todos los pesos entrantes, como resultado de la modificación, cambian en la misma cantidad. En este caso, la relación original de pesos se fijó de forma aleatoria. ¿Debería ser así?

 

Hola, paralocus.

Vayamos paso a paso. Se tiene un vector de entrenamiento de longitud n-cuentas, y necesitamos generar un vector de error para corregir todos los pesos de la red. Es evidente que la longitud del vector será igual al número de pesos w contando los pesos de nivel constante. El vector de error se generará sólo al final de la primera (segunda, tercera, etc.) época de entrenamiento. El método de su formación es el siguiente:

1. En el primer paso del entrenamiento (hay un total de n en cada época), formamos un error individual para cada peso y no corregimos los pesos. Luego, en el segundo paso, habiendo formado una corrección similar, añadirla a la anterior, etc. n veces. Se obtiene una corrección total (teniendo en cuenta el signo de cada término) para cada peso. Este es un punto importante. Esta corrección final no debe usarse - ¡los pesos se harán pedazos! Se debe dividir por la norma del vector de corrección. Para ello, cuente la suma de cuadrados de cada corrección dentro de una época de entrenamiento para cada peso por separado. En cuanto terminamos una época(n ciclos dentro de ella), tomamos la raíz cuadrada de la suma de cuadrados de cada peso por separado, y dividimos personalmente cada corrección por esta norma. Corregimos cada peso.

2. De 10 a 1000 épocas de entrenamiento, según el objetivo del entrenamiento (signo o amplitud). Proceda de la misma manera. Punto importante: al pasar de una época a otra, se debe observar estrictamente una disminución monótona de la amplitud de la corrección de los pesos. La cuadrícula no debe ser perezosa para buscar un mínimo cada vez más profundo en el potencial de la función de error. Su aplicación es sencilla. Al final de una época, antes de la corrección del peso, multiplica el corrector por el valor 1-j/N, donde N es el número de épocas de entrenamiento y j es el número de época actual.

3. Para evitar el inevitable efecto de saturación de algunos pesos del CETI durante su entrenamiento, es necesario afectar a todos los pesos con una tangente hiperbólica inmediatamente después de la siguiente corrección de pesos. Este procedimiento no es obvio, pero es extremadamente efectivo. Debido a la suavidad y monotonicidad del AF utilizado, todos los pesos se mantendrán siempre en el rango +/-1 y el acto de actuar no provoca "histeria" en la niña.

Eso es todo por ahora. Digerir y hacer preguntas.

En cuanto a la pregunta de cómo pasar del RSI a la compra/venta, es más bien una pregunta para usted, después de todo, usted mismo ideó el movimiento. Por ejemplo, lo que "pronostico", también lo uso para la entrada (y estoy pronosticando exactamente para la Compra/Venta). Por eso no hay contradicción. Y tú intentas predecir el color del papel pintado de un piso arbitrario por el color de un coche frente a la ventana de su cocina...

 

Mientras escribía el post recordando los detalles de la aplicación, había algunas imprecisiones.

He mirado el código y resulta que estaba influyendo en FA sobre los pesos una vez al cambiar a una nueva previsión, es decir, no cada época, sino cuando era necesario volver a entrenar la red cuando entraban nuevos datos.

Una cosa más. La corrección del peso es el producto del error de la salida de la neurona por la derivada FA y por la salida de la neurona (amplitud, teniendo en cuenta el signo) de la que entra la señal.

Este es el aspecto de un perseptrón con una salida no lineal (por ejemplo):

Aquí las épocas se numeran con el índice L. Lo muestro a propósito en MathCad, es más claro. In - número de entradas, x - vector de entrada. El resto parece estar claro.

 
Neutron >> :

En cuanto a cómo cambiar de RSI a Compra/Venta, eso es más bien una pregunta para ti, tú mismo has ideado ese movimiento. Por ejemplo, lo que predigo, también lo uso para la entrada (y predigo exactamente para la Compra/Venta). Por eso no hay contradicción. Y tú intentas predecir el color del papel pintado de un piso arbitrario por el color del coche que está frente a la ventana de la cocina de ese piso...

Hola, Neutron.

Ahora mismo estoy lidiando con lo que has escrito. Es que las matemáticas me chirrían mucho. La programación es un poco más fácil. Y sobre el papel pintado, tienes toda la razón, pero aún no sé qué poner en la parrilla, aparte de todo el mismo papel pintado, pero de otra fábrica (creo que el resultado será el mismo). Aquí en el foro leí este artículo, empezó mi interés por las redes neuronales. Y en ese artículo, como sabéis, en una entrada del pobre perceptrón, los avispados compañeros del foro meten el índice AO (o AC - los confundo constantemente), y para tener algo que mirar, lo dividieron en "clusters" repartiendo las entradas del Perceptrón en la gráfica del mencionado índice(dt/dl ). Lo llaman todo "NEUROSETTING" o incluso "TRADING WITH THE NETHERLANDS O... (no, no es eso lo que quería decir) AUTOMATIZACIÓN DE LA VIDA". Eso es mucho dinero... en un probador.

Muy bien... eso fue una digresión.

Así que, después de ese artículo y un par de otros similares (por los enlaces del mismo) he empezado a experimentar con los perceptrones de diferentes maneras. En fin, es como esa canción:

"Vanka se sienta en el banco, golpeando tres kopecks con su polla.

Quiere hacer tres rublos - ¡No sale nada!"

Sin embargo, mi interés por los no cultivadores con el fin de utilizarlos en el comercio se ha mantenido e incluso ha crecido con el tiempo. El hecho de que todavía no se me ocurra nada mejor que la agrupación RSI - no es culpa de mi tío, pero es "un palo con dos puntas". Es decir, para saber qué y cómo poner en las mallas de entrada, necesito saber cómo están dispuestas estas mallas y no sólo saberlo, sino también ser capaz de hacerlo. Al menos en algunas formas no muy complicadas, pero suficientes para un trabajo estable en lo real. Por eso me dirigí a ti.


P.D. ¿Nada de que fui en un "tú"? Así es más amable.

Razón de la queja: