Probabilistische neuronale Netze, Pakete und Algorithmen für MT4 - Seite 11

 
renegate:
Meine Herren!
Was sollen wir also dem Eingang des neuronalen Netzes zuführen? Welche Fehlerfunktion sollen wir wählen?


Nach dem Inhalt zu urteilen, sind nicht viele Menschen daran interessiert. Viele Leute denken, es geht um die Software....

Ich schlage vor, dass Sie mit der Steigung der Regressionslinie mit verschiedenen Perioden beginnen und mit verschiedenen TFs beginnen. :)

Funktionsweise des Fehlers - maximaler Gewinn.

 
klot:

Nach dem Inhalt zu urteilen, sind nicht viele Menschen daran interessiert. Viele Leute denken, es sei die Software....


Ja, es gibt eine Menge neuronaler Threads. Und überall verstopfen die Fluter jede Diskussion mit dummen Anfragen nach Software und Dutzenden von Nachrichten "ich und ich und ich".

Wir können also nirgendwo richtig darüber diskutieren. Vielleicht gibt es ein streng moderiertes Forum, in dem sie die Lakaien erschießen? Wer ein Wort sagt, bekommt einen Verweis, wer zwei Dinge sagt, die nicht zum Thema gehören, wird für immer ignoriert.

Cloth, du hast viele Orte, an denen du dich aufhalten kannst, vielleicht hast du einen Ort im Sinn?

 
TedBeer:
klot:

Nach dem Inhalt zu urteilen, sind nicht viele Menschen daran interessiert. Viele Leute denken, es geht um die Software....


Oh Mann!!!, so viele Themen über Neuronik. Und überall verstopfen die Überschwemmer jede Diskussion mit dummen Anfragen nach Software und Dutzenden von Nachrichten "ich und ich und ich".

Wir können also nirgendwo richtig darüber diskutieren. Vielleicht gibt es ein streng moderiertes Forum, in dem sie die Lakaien erschießen? Wer ein Wort sagt, bekommt einen Verweis, wer zwei Dinge sagt, die nicht zum Thema gehören, wird für immer ignoriert.

Cloth, du hast viele Orte, an denen du dich aufhalten kannst, vielleicht kennst du einen Ort, den du gerne ausprobieren würdest.


Ich habe ein Forum eröffnet und werde es jetzt abgrasen :) Und ich lade alle ein, eine praktische Diskussion zu führen. Ich werde die Fluter selbst abschießen :)

http://www.fxreal.ru/forums/index.php

Ich übertrage meine Erkenntnisse von verschiedenen Orten nach und nach dorthin.

 

Ein Beispiel für ein einfaches Nicht-Netz

MICROSOFT VISUAL C++ 6.0

Netzwerk lernt XOR-Verknüpfung

 
/* ========================================== *
 * Filename:    bpnet.h                       *
 * Author:        James Matthews.               *
 *                                              *
 * Description:                                  *
 * This is a tiny neural network that uses      *
 * back propagation for weight adjustment.      *
 * ========================================== */
 
#include <math.h>
#include <stdlib.h>
#include <time.h>
 
#define BP_LEARNING    (float)(0.5)    // The learning coefficient.
 
class CBPNet {
    public:
        CBPNet();
        ~CBPNet() {};
 
        float Train(float, float, float);
        float Run(float, float);
 
    private:
        float m_fWeights[3][3];        // Weights for the 3 neurons.
 
        float Sigmoid(float);        // The sigmoid function.
};
 
CBPNet::CBPNet() {
    srand((unsigned)(time(NULL)));
    
    for (int i=0;i<3;i++) {
        for (int j=0;j<3;j++) {
            // For some reason, the Microsoft rand() function
            // generates a random integer. So, I divide by the
            // number by MAXINT/2, to get a num between 0 and 2,
            // the subtract one to get a num between -1 and 1.
            m_fWeights[i][j] = (float)(rand())/(32767/2) - 1;
        }
    }
}
 
float CBPNet::Train(float i1, float i2, float d) {
    // These are all the main variables used in the 
    // routine. Seems easier to group them all here.
    float net1, net2, i3, i4, out;
    
    // Calculate the net values for the hidden layer neurons.
    net1 = 1 * m_fWeights[0][0] + i1 * m_fWeights[1][0] +
          i2 * m_fWeights[2][0];
    net2 = 1 * m_fWeights[0][1] + i1 * m_fWeights[1][1] +
          i2 * m_fWeights[2][1];
 
    // Use the hardlimiter function - the Sigmoid.
    i3 = Sigmoid(net1);
    i4 = Sigmoid(net2);
 
    // Now, calculate the net for the final output layer.
    net1 = 1 * m_fWeights[0][2] + i3 * m_fWeights[1][2] +
             i4 * m_fWeights[2][2];
    out = Sigmoid(net1);
 
    // We have to calculate the deltas for the two layers.
    // Remember, we have to calculate the errors backwards
    // from the output layer to the hidden layer (thus the
    // name 'BACK-propagation').
    float deltas[3];
    
    deltas[2] = out*(1-out)*(d-out);
    deltas[1] = i4*(1-i4)*(m_fWeights[2][2])*(deltas[2]);
    deltas[0] = i3*(1-i3)*(m_fWeights[1][2])*(deltas[2]);
 
    // Now, alter the weights accordingly.
    float v1 = i1, v2 = i2;
    for(int i=0;i<3;i++) {
        // Change the values for the output layer, if necessary.
        if (i == 2) {
            v1 = i3;
            v2 = i4;
        }
                
        m_fWeights[0][i] += BP_LEARNING*1*deltas[i];
        m_fWeights[1][i] += BP_LEARNING*v1*deltas[i];
        m_fWeights[2][i] += BP_LEARNING*v2*deltas[i];
    }
 
    return out;
}
 
float CBPNet::Sigmoid(float num) {
    return (float)(1/(1+exp(-num)));
}
 
float CBPNet::Run(float i1, float i2) {
    // I just copied and pasted the code from the Train() function,
    // so see there for the necessary documentation.
    
    float net1, net2, i3, i4;
    
    net1 = 1 * m_fWeights[0][0] + i1 * m_fWeights[1][0] +
          i2 * m_fWeights[2][0];
 
    net2 = 1 * m_fWeights[0][1] + i1 * m_fWeights[1][1] +
          i2 * m_fWeights[2][1];
 
    i3 = Sigmoid(net1);
    i4 = Sigmoid(net2);
 
    net1 = 1 * m_fWeights[0][2] + i3 * m_fWeights[1][2] +
             i4 * m_fWeights[2][2];
    return Sigmoid(net1);
}
 
//---
 
#include <iostream.h>
#include "bpnet.h"
 
#define BPM_ITER    2000
 
void main() {
 
    CBPNet bp;
 
    for (int i=0;i<BPM_ITER;i++) {
        bp.Train(0,0,0);
        bp.Train(0,1,1);
        bp.Train(1,0,1);
        bp.Train(1,1,0);
    }
 
    cout << "0,0 = " << bp.Run(0,0) << endl;
    cout << "0,1 = " << bp.Run(0,1) << endl;
    cout << "1,0 = " << bp.Run(1,0) << endl;
    cout << "1,1 = " << bp.Run(1,1) << endl;
}
Dateien:
bp_case.zip  41 kb
 

Ein weiteres einfaches Netzwerk!

MICROSOFT VISUAL C++ 6.0

in dieser Version können Sie Schichten hinzufügen - die Anzahl der Neuronen in den Schichten ändern

Zunächst gibt es 3 Ebenen in der Quelle

2 Neuronen am Eingang - zwei in einer versteckten Schicht und eines am Ausgang!

// Erstellen Sie ein neuronales Netz mit 3 Schichten zur Lösung des XOR-Problems, mit 2 Knoten in den ersten beiden Schichten,
// und einem einzelnen Knoten in der Ausgabeschicht.
CBPNet XOR( 3 /* Anzahl der Schichten */, 2 /* Eingänge */,2 /* versteckt */,1 /* Ausgänge */ );

//
//
// O - Output
// // \
// // O O - Hidden
// |\ /|
// | | X
// |/ \|
// O - Input
//

Wenn Sie zum Beispiel 3 Neuronen in eine versteckte Schicht einsetzen, wird das Ergebnis genauer.


CBPNet XOR( 3 /* Anzahl der Schichten */, 2 /* Eingänge */,3 /* versteckt */,1 /* Ausgänge */ );

eine Erhöhung der Anzahl der Schichten erfordert auch eine Erhöhung der Anzahl der Neuronen in den verborgenen Schichten

CBPNet XOR( 4 /* Anzahl der Schichten */, 2 /* Eingänge */,20 /* versteckt 1 */ ,5 /* versteckt 2 */ ,1 /* Ausgänge */ );

Wenn Sie die Anzahl der Ebenen erhöhen, müssen Sie auch einen Aufruf hinzufügen

// Anwendung der Vorspannung auf die versteckte Schicht und die Ausgabeschicht
XOR.SetBias( POINT2D(0,1),BIAS_GLOBAL );
XOR.SetBias( POINT2D(1,1),BIAS_GLOBAL );
XOR.SetBias( POINT2D(1,1),BIAS_GLOBAL );
XOR.SetBias( POINT2D(0,2),BIAS_GLOBAL );

Ich habe es geschafft, das Ergebnis zu erhalten, aber das Netzwerk ist viel langsamer zu lernen!

Dateien:
cftai.zip  14 kb
 
klot:
Ich habe ein Forum eröffnet und werde es jetzt abgrasen :) Und ich lade alle ein, eine praktische Diskussion zu führen. Ich werde die Fluter selbst abschießen :)
Ich werde mich registrieren lassen.
 

und ein wunderschönes Tutorial!

Dateien:
summing1.zip  48 kb
 

Es funktioniert wunderbar. Sie könnten auch versuchen, dem Netz ein Einmaleins in Form einer Mustererkennung beizubringen.

Wie: in[0]=2; in[1]=2; out_des[0]=4; etc.....

 
YuraZ:

und ein wunderschönes Tutorial!

Wer sonst würde es für Nicht-Programmierer kompilieren...
 
klot:
Renegat:
Meine Herren!
Was sollen wir also dem Eingang des neuronalen Netzes zuführen? Welche Fehlerfunktion sollen wir wählen?


Nach dem Inhalt zu urteilen, sind nicht viele Menschen daran interessiert. Viele Leute denken, es geht um die Software....

Ich schlage vor, dass Sie mit der Steigung der Regressionslinie mit verschiedenen Perioden beginnen und mit verschiedenen TFs beginnen. :)

Funktionaler Fehler - maximaler Gewinn.

Vielleicht wäre es besser, die Fehlerfunktionalität zu verwenden - nicht den maximalen Gewinn, sondern die Entkopplung (Differenz zwischen Prognose und Close[0]).