Marktknigge oder gute Manieren im Minenfeld - Seite 16

 
paralocus писал(а) >>

Neutron, ich werde eine kurze Auszeit nehmen. Ich muss alles noch einmal überdenken und es in Codes für mindestens ein Neuron umsetzen. Wie auch immer, ein oder zwei Tage, und dann machen wir weiter.

Ich weiß das wirklich zu schätzen!

Gut.

 
Neutron >> :

Gut.

Hallo Neutron. Hier, ich habe etwas gemacht.

Ich habe ein so kleines Raster für den ORO-Algorithmus erstellt:



Hier ist der Code des Gitters selbst (es ist die Header-Datei 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);
}



Hier ist, wie ich versucht, es in einem leeren Expert Advisor zu lehren:

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

}



Im Grunde genommen gerät dieses Netz "aus den Fugen". Die Gewichtungskoeffizienten werden nach 10 Schritten (Balken) lächerlich hoch. Ich habe lange nach einem Fehler im Code gesucht und herausgefunden, dass er so funktioniert, wie er sollte.

D.h. wenn wir einfach einen am Ausgang des Gitters ermittelten Fehler zu allen Gewichten der Ausgabeschicht addieren, neigen diese Koeffizienten dazu, zu schnell zu wachsen.

Das Skalimeter hält das nicht aus... -:) Bislang habe ich nur versucht, den Fehler auf die Gewichte der Ausgabeschicht zu übertragen.

Frage eins: Was habe ich falsch gemacht?

Frage zwei:

Ich möchte die Wahrscheinlichkeit eines erfolgreichen Kaufs/Verkaufs in der Ausgabe des Rasters oder eine Empfehlung zum Rauchen von Bambus erhalten. Aber dieses Raster ist darauf trainiert, den Wert des RSI bei n+1 Takten vorherzusagen...

Was springt für mich dabei heraus?

 

in der Funktion ORO werden die Gewichte nicht korrekt geändert

Lesen Sie die Theorie, zumindest hier

 
maxfade >> :

in der Funktion ORO werden die Gewichte nicht korrekt geändert

lesen Sie die Theorie, zumindest hier

Danke, aber ich verstehe da gar nichts.

 

Der Fehler in der Ausgabeschicht sollte nach der Formel e=OUT*(1-OUT)*(TEST-OUT) berechnet werden (dies gilt für die logistische Übertragungsfunktion, für den hyperbolischen Tangens scheint die Formel etwas anders zu sein, ist aber auch nicht allzu kompliziert)

die Gewichtung der Neuronen sollte gemäß w+=nju*e*OUT geändert werden, wobei nju ein Lernschritt ist

Wenn der Schritt zu groß ist, wird das Netz instabil, und es kommt zu einem unendlichen Anstieg der Gewichte (wie in Ihrem Fall, Sie verwenden (TEST-OUT) ohne alle anderen Multiplikatoren)

Wenn es zu klein ist, braucht das Netz zu lange, um zu lernen, und kann auf ein lokales Minimum stoßen.

 
maxfade >> :

Der Fehler in der Ausgabeschicht sollte nach der Formel e=OUT*(1-OUT)*(TEST-OUT) berechnet werden (dies gilt für die logistische Übertragungsfunktion, für den hyperbolischen Tangens scheint die Formel etwas anders zu sein, ist aber auch nicht allzu kompliziert)

die Gewichtung der Neuronen sollte gemäß w+=nju*e*OUT geändert werden, wobei nju ein Lernschritt ist

Wenn der Schritt zu groß ist, wird das Netz instabil, und es kommt zu einem unendlichen Anstieg der Gewichte (wie in Ihrem Fall, Sie verwenden (TEST-OUT) ohne alle anderen Multiplikatoren)

Wenn sie zu klein ist, braucht sie zu lange, um zu lernen, und könnte auf ein lokales Minimum stoßen.


Danke, ich werde es gleich ausprobieren.

 
maxfade >> :

Wenn der Schritt zu groß ist, wird das Netz instabil, und es kommt zu einem unendlichen Anstieg der Gewichte (wie in Ihrem Fall, wenn Sie (TEST-OUT) ohne alle anderen Multiplikatoren verwenden).

Wenn sie zu klein ist, braucht sie zu lange, um zu lernen, und könnte auf ein lokales Minimum stoßen.


Es verwirrt mich ein wenig, dass die Änderung dazu führt, dass die "relative Position" der Gewichte unverändert bleibt. Dies liegt daran, dass sich alle eingehenden Gewichte infolge der Änderung um den gleichen Betrag ändern. In diesem Fall wurde das ursprüngliche Verhältnis der Gewichte zufällig festgelegt. Sollte dies der Fall sein?

 

Hallo, Paralocus.

Lassen Sie uns einen Schritt nach dem anderen machen. Sie haben einen Trainingsvektor der Länge n-Counts, und wir müssen einen Fehlervektor erzeugen, um alle Gewichte des Netzes zu korrigieren. Es ist klar, dass die Länge des Vektors gleich der Anzahl der Gewichte w ist, wenn man die Gewichte der konstanten Ebene mitzählt. Der Fehlervektor wird erst am Ende der ersten (zweiten, dritten usw.) Trainingsepoche erzeugt. Das Verfahren zu seiner Bildung ist wie folgt:

1. Im ersten Schritt des Trainings (es gibt insgesamt n Epochen) bilden wir für jedes Gewicht einen individuellen Fehler und korrigieren die Gewichte nicht. Im zweiten Schritt, nachdem eine ähnliche Korrektur vorgenommen wurde, fügen Sie diese der vorherigen hinzu usw. n-mal. Sie erhalten eine Gesamtkorrektur (unter Berücksichtigung der Vorzeichen der einzelnen Terme) für jedes Gewicht. Dies ist ein wichtiger Punkt. Diese Endkorrektur sollte nicht verwendet werden - die Gewichte gehen sonst kaputt! Sie sollte durch die Norm des Korrekturvektors geteilt werden. Dazu zählen Sie die Summe der Quadrate jeder Korrektur innerhalb einer Trainingsepoche für jedes Gewicht separat. Sobald wir eine Epoche(n-Zyklen innerhalb dieser Epoche) beendet haben, nehmen wir die Quadratwurzel der Summe der Quadrate für jedes einzelne Gewicht und teilen persönlich jede Korrektur durch diese Norm. Wir korrigieren jedes Gewicht.

2. 10 bis 1000 Trainingsepochen, je nach dem Zweck des Trainings (Vorzeichen oder Amplitude). Gehen Sie auf die gleiche Weise vor. Wichtiger Punkt: Wenn Sie von Epoche zu Epoche gehen, sollten Sie unbedingt eine monotone Abnahme der Amplitude der Gewichtskorrektur beachten. Das Grid sollte nicht zu faul sein, um nach einem immer tieferen Minimum im Fehlerfunktionspotenzial zu suchen. Sie wird einfach umgesetzt. Am Ende einer Epoche, vor der Gewichtskorrektur, wird der Korrektor mit dem Wert 1-j/N multipliziert, wobei N die Anzahl der Trainingsepochen und j die aktuelle Epochennummer ist.

3. Um den unvermeidlichen Effekt der Sättigung einiger Gewichte des CETI während seines Trainings zu verhindern, ist es notwendig, alle Gewichte unmittelbar nach der nächsten Korrektur der Gewichte mit einer hyperbolischen Tangente zu versehen. Dieses Verfahren ist nicht offensichtlich, aber äußerst wirksam. Aufgrund der Sanftheit und Monotonie des verwendeten FA bleiben alle Gewichte immer im Bereich von +/- 1, und der Akt des Handelns verursacht keine "Hysterie" bei dem Mädchen.

Das ist alles für den Moment. Auswerten und Fragen stellen.

Was die Frage betrifft, wie man von RSI auf Kaufen/Verkaufen umsteigt, so ist das eher eine Frage an Sie - schließlich haben Sie sich den Schritt selbst ausgedacht. Zum Beispiel, was ich "vorhersage", verwende ich auch für den Einstieg (und ich prognostiziere genau für Kauf/Verkauf). Deshalb gibt es auch keinen Widerspruch. Und Sie versuchen, die Farbe der Tapete in einer beliebigen Wohnung anhand der Farbe eines Autos vor dem Küchenfenster vorherzusagen...

 

Als ich den Beitrag schrieb und mich an die Details der Umsetzung erinnerte, gab es einige Ungenauigkeiten.

Ich habe mir den Code angesehen, und es hat sich herausgestellt, dass ich FA einmal beim Wechsel zu einer neuen Vorhersage beeinflusst habe, d. h. nicht bei jeder Epoche, sondern wenn es notwendig war, das Netz neu zu trainieren, wenn neue Daten eintrafen.

Noch eine Sache. Die Korrektur des Gewichts ist das Produkt aus dem Fehler des Neuronenausgangs durch die FA-Ableitung und durch den Neuronenausgang (Amplitude, unter Berücksichtigung des Vorzeichens), von dem das Signal eingegeben wird.

So sieht es zum Beispiel bei einem Perseptron mit nicht-linearem Ausgang aus:

Hier werden die Epochen durch den Index L nummeriert. Ich zeige es absichtlich in MathCad, weil es so übersichtlicher ist. In - Anzahl der Eingänge, x - Eingangsvektor. Der Rest scheint klar zu sein.

 
Neutron >> :

Wie man von RSI auf Kaufen/Verkaufen umschaltet, ist eher eine Frage an Sie - Sie sind selbst auf diese Idee gekommen. Ich, zum Beispiel, was ich voraussage, gebe ich auch ein (und ich sage genau den Kauf/Verkauf voraus). Deshalb gibt es auch keinen Widerspruch. Und Sie versuchen, die Farbe der Tapete in einer beliebigen Wohnung anhand der Farbe des Autos vor dem Küchenfenster dieser Wohnung zu bestimmen...

Hallo, Neutron.

Ich habe gerade mit dem zu tun, was Sie geschrieben haben. Es ist nur so, dass Mathe in meinem Kopf wirklich knirscht. Programmieren ist ein bisschen einfacher. Und was die Tapete angeht - du hast völlig recht - aber ich weiß immer noch nicht, was ich in das Raster einfügen soll, abgesehen von derselben Tapete, aber einer anderen Fabrik (ich denke, das Ergebnis wird dasselbe sein). Hier im Forum habe ich diesen Artikel gelesen, der mein Interesse an neuronalen Netzen geweckt hat. Und in diesem Artikel, wie Sie wissen, auf einem Eingang armen Perceptron, schieben clevere Jungs aus Forum AO-Index (oder AC - ich verwirren sie ständig), und etwas zu beobachten haben, teilten sie es in "Cluster" durch die Aufteilung der Eingänge von Perceptron auf Grafik des genannten Index(dt/dl ). Sie nennen das alles "NEUROSETTING" oder auch "HANDEL IN DEN NIEDERLANDE O... (nein, das habe ich nicht gemeint) SLIVE AUTOMATIZATION". Das ist eine Menge Geld... in einem Prüfgerät.

In Ordnung... Das war eine Abschweifung.

Nach diesem Artikel und einer Reihe ähnlicher Artikel (durch die darin enthaltenen Links) habe ich begonnen, mit Perceptrons auf verschiedene Weise zu experimentieren. Wie auch immer, es ist wie in diesem Lied:

"Vanka sitzt auf der Bank und stößt drei Kopeken mit seinem Schwanz.

Will drei Rubel machen - nichts kommt raus!"

Mein Interesse an Nicht-Erzeugern, um sie für den Handel zu nutzen, ist jedoch geblieben und im Laufe der Zeit sogar noch gewachsen. Die Tatsache, dass mir noch nichts Besseres als RSI-Clustering einfällt, ist zwar nicht die Schuld meines Onkels, aber es ist "ein Stock mit zwei Enden". D.h. um zu wissen, was und wie ich in die Eingabemaschen einfüge, muss ich wissen, wie diese Maschen angeordnet sind, und ich muss es nicht nur wissen, sondern auch in der Lage sein, es zu tun. Zumindest in einigen nicht sehr komplizierten Formen, die aber für eine stabile Arbeit in der Realität ausreichen. Deshalb habe ich mich an Sie gewandt.


P.S. Nichts, dass ich auf ein "Du" ging? Auf diese Weise ist es angenehmer.

Grund der Beschwerde: