Eine schnelle und kostenlose Bibliothek für MT4, sehr zur Freude der Neuralnetworker - Seite 9

 
Dies ist ein Komitee von 16 Gittern, Sie können sich die erstellten Dateien ansehen.
 
Henry_White >> :

Wenn wir ein Gitter mit einem Ausgangsneuron haben, wie kommen wir dann auf 16 Ausgänge...? Oder ist es ein Ausschuss mit 16 Netzen?

Das ist es.

 

Hallo zusammen!

Ich habe die ganze Nacht an einem Stück Code herumgeschraubt

void ann_prepare_input () {
    int i;
    double res = 0;
	 for( i = 0; i < AnnInputs; i++) {
      res = (iRSI(Symbol(), 0, 30, PRICE_OPEN, i) - 50.0) / 50.0; 
      if (MathAbs( res) > 1) {
         if ( res > 0) {
            InputVector[ i] = 1.0;            
         } else {
            InputVector[ i] = -1.0;            
         }
      } else {
         InputVector[ i] = res;            
      }
    }
}

Ich verstehe nicht, welchen Sinn es hat

if (MathAbs( res) > 1) {
         if ( res > 0) {
            InputVector[ i] = 1.0;            
         } else {
            InputVector[ i] = -1.0;            
         }
      } else {
         InputVector[ i] = res;            
      }

wenn der Wert res nicht größer als eins sein kann.

Bitte erläutern Sie diesen Punkt, wenn er kein Geheimnis ist.

 
alex_r >> :

Hallo zusammen!

Ich habe jetzt zwei Nächte lang an diesem Code gearbeitet.

Ich verstehe nicht, welchen Sinn es hat

wenn der Wert res nicht größer als eins sein kann.

Bitte erläutern Sie diesen Punkt, wenn er kein Geheimnis ist.

Normalisierte Werte (1;-1) sollten dem Eingang des NS zugeführt werden. Andernfalls kann die NS-Ausbildung zu undefinierten Ergebnissen führen.

 

Nun, wie Res berechnet wird

Zustand

(MathAbs(res) > 1)
wird nie erfüllt und die Eingabe wird
res = (iRSI(Symbol(), 0, 30, PRICE_OPEN, i) - 50.0) / 50.0
und hier erhalten Sie in 99,99 % der Fälle natürlich etwas anderes als 1 und -1.
wenn ja
for( i = 0; i < AnnInputs; i++) {
      res = (iRSI(Symbol(), 0, 30, PRICE_OPEN, i) - 50.0) / 50.0; 

         if ( res > 0) {                 
            InputVector[ i] = 1.0;            
         } else {
            InputVector[ i] = -1.0;            
         }        

    }

dann nur 1 und -1

oder liege ich falsch?

 
alex_r >> :

>> oder liege ich falsch?

Falsch. Hier funktioniert alles korrekt. Sie sollten den Code genauer studieren. Es ist sehr einfach und offensichtlich. Ich verstehe den Sinn Ihres "//" nicht - es "tötet" den Sinn vollständig.

iRSI gibt grundsätzlich Werte von 0 bis 100 an, mit seltenen Ausreißern außerhalb des Bereichs (deshalb (MathAbs(res) > 1) ), so dass res in 99,9 % der Fälle zwischen 1 und -1 liegt, während InputVector bei 100 % liegt.

Wenn Sie eine Aufschlüsselung der einzelnen Operatoren erwarten, glaube ich nicht, dass irgendjemand hier die Fähigkeit hat, Programmierunterricht zu geben. Und für diesen Abschnitt wird es Offtopic sein. Vielleicht sollten Sie sich damit in einem anderen Bereich des Forums bewerben oder sich bei mir melden.

PS. Kommentieren" Sie nicht den Code eines anderen (es ist besser, ihn zu kommentieren). Das kann andere in die Irre führen und ist imho einfach ein schlechter Ton. Wenn Sie mit dem Autor nicht einverstanden sind, schreiben Sie Ihre Variante.

 

Der Kommentar wurde entfernt.

Nun erkläre ich, bei res>0, hier entspricht 0 dem Level 50 des RSI-Indikators, vergeben wir 1, ansonsten vergeben wir -1

Was ist nicht klar? Ein Minimum an Code und sonst nichts.

Wie es im Quellcode steht, ist die Hauptbedingung der Datennormalisierung NICHT erfüllt.

Das Einzige, was man tun kann, ist, eine weitere Null zu filtern, aber das ist in diesem Fall nicht so wichtig.

 
Ihre Variante ergibt entweder -1 oder 1. Und wozu ist das alles gut? Und wie wollen Sie ein Netzwerk mit DIESER Methode trainieren? Oder besser gesagt, WARUM? Welchen Nutzen hat diese "Binarität" der Staaten? Wie erstellt man daraus ein Muster, um das Netz zu trainieren?
 
Henry_White >> :

Normalisierte Werte (1;-1) müssen dem NS-Eingang zugeführt werden. Andernfalls kann die Ausbildung der NS zu unsicheren Ergebnissen führen.

Vielleicht waren Sie durch diesen Beitrag verwirrt. Hier meinte ich den Bereich, nicht die binären Zustände.

 
alex_r >> :

Wie im Quellcode beschrieben, ist die Hauptbedingung für die Datennormalisierung NICHT erfüllt.

Sie irren sich, denn die Gittereingänge (Schicht 1) sind Sigmoide, die auf den Bereich -1;1 eingestellt sind. Daher ist jeder Wert an den Eingängen im Bereich von -1 bis 1 eine notwendige und ausreichende Bedingung für die Normalisierung.


Sie versuchen, die Sigmoidfunktion durch eine benutzerdefinierte Funktion Signum(input) zu ersetzen, die die Diskretion der Eingabedaten unterschätzt und zu Situationen führt, in denen der Trainingssatz eine große Anzahl von sich gegenseitig widersprechenden Daten enthält.