fyords: Natürlich habe ich nichts dagegen, die Feinheiten neuronaler Netze in diesem Thread zu diskutieren, aber ursprünglich war der Artikel für Anfänger gedacht. Er lässt einige Details aus, weil gerade diese Details einen Neuling in Sachen neuronale Netze verwirren können. Natürlich geht der Artikel nicht auf die verschiedenen Methoden des Trainings (der Anpassung) neuronaler Netze ein, aber das ist in der Anfangsphase auch nicht nötig. Wenn Sie feststellen, dass neuronale Netze gar nicht so schwierig sind, ist das kein Grund, sich abzuwenden und zu sagen: "Das ist sehr schwierig und nichts für mich". Wenn Sie mehr wissen, ist das großartig, dann ist der Artikel wahrscheinlich nichts für Sie.
Das Fehlen der Details, nach denen ich oben gefragt habe, hat mich als gewöhnlichen Dummkopf bisher verblüfft. Ich habe den Artikel dreimal durchgelesen, aber die notwendigen Antworten nur im Forum gefunden.
fyords: Der zweite Teil wird sich im Moment mit der Arbeit mit mehrschichtigen neuronalen Netzen befassen, wenn Sie Wünsche zum Inhalt haben, schreiben Sie diese bitte kurz.
Nur eine Frage ist von Interesse: Wie kann man ein selbstlernendes Programm erstellen, das ohne einen "externen" Optimierer auskommt. Wenn so etwas in diesem Stadium möglich ist, natürlich.
Nach einiger Überlegung wurde beschlossen, den zweiten Teil des Artikels zu schreiben.
Im Moment wird der zweite Teil die Arbeit mit mehrschichtigen neuronalen Netzen behandeln. Wenn Sie Wünsche zum Inhalt haben, schreiben Sie sie bitte kurz auf. Die Ideen, die ich mit meinen Fingern vermitteln kann, werden im Artikel beschrieben.
Ich danke Ihnen.
Ich würde gerne die Methode des Gradientenlernens an den Fingern beschrieben sehen.
Ich nehme "naiv" an, dass es unter russischen Muttersprachlern nicht üblich ist, den Prozess des unabhängigen Lernens als "Parameteranpassung" zu bezeichnen. Ebenso wenig ist es üblich, die Auswahl von Parametern (mit Hilfe von externen Prozessen) für ein beliebiges System als Lernen zu bezeichnen.
Wie auch immer man die Anpassung nennt, sie wird nicht aufhören, eine Anpassung zu sein.
Optimierung, Anpassung und Lernen für neuronale Netze, die mit nicht-stationären Daten arbeiten, sind Synonyme. Denn alle drei Begriffe bedeuten das Gleiche: die Auswahl von Gewichtungskoeffizienten für vergangene historische Daten (Trainingsstichprobe), um Fehler in der Ausgabe des neuronalen Netzes zu minimieren. Wenn es möglich wäre, das Netz mit zukünftigen Daten zu füttern, dann wäre es etwas anderes. Aber in den Geschäften für Büroausstattung gibt es noch keine Zeitmaschinen, also müssen wir die Vergangenheit anpassen.
Nur eine Frage ist von Interesse: wie kann man ein selbstlernendes Programm erstellen, das ohne einen "externen" Optimierer auskommt. Wenn so etwas in diesem Stadium möglich ist, natürlich.
Das ist ganz einfach. Der EA-Code kann das Netz selbst und seinen Optimierer für die Gewichte enthalten, der automatisch gestartet werden kann, wenn neue Daten eintreffen. Unter neuronalen Netzen verstehen wir in den meisten Fällen solche selbstlernenden Netze. Netze, die extern trainiert werden, zum Beispiel durch den Optimierer des Testers, sind Spielzeuge.
Leute, helft mir! Habe ich richtig verstanden, dass die Normalisierung der Eingabedaten für den gesamten Trainingszeitraum des Netzes durchgeführt werden sollte? Ich meine, die maximalen und minimalen Werte von xi sollten aus dem gesamten Zeitraum genommen werden?
net: Leute, helft mir! Habe ich richtig verstanden, dass die Normalisierung der Eingabedaten für den gesamten Trainingszeitraum des Netzes durchgeführt werden sollte? Ich meine, die maximalen und minimalen Werte von xi sollten aus dem gesamten Zeitraum genommen werden?
Das ist für die gesamte Trainingsstichprobe erforderlich.
//+------------------------------------------------------------------+//|macd-neuro-example.mq5 |//| Copyright 2012, MetaQuotes Software Corp. | |//|http://www.mql5.com |//+------------------------------------------------------------------+#property copyright "Copyright 2012, MetaQuotes Software Corp."#property link "http://www.mql5.com"#property version "1.00"//+------------------------------------------------------------------+//| Experteninitialisierungsfunktion|//+------------------------------------------------------------------+#define SIZE 1000#include <Trade\Trade.mqh> //Verbinden Sie die Bibliothek für die Durchführung von Handelsoperationen#include <Trade\PositionInfo.mqh> //Verbinden Sie die Bibliothek, um Informationen über Positionen zu erhalten#include <Indicators/TimeSeries.mqh>//--- Werte der Gewichtungskoeffizienten inputdouble w0=0.5;
inputdouble w1=0.5;
inputdouble w2=0.5;
inputdouble w3=0.5;
inputdouble w4=0.5;
inputdouble w5=0.5;
inputdouble w6=0.5;
inputdouble w7=0.5;
inputdouble w8=0.5;
inputdouble w9=0.5;
inputdouble w10=0.5;
inputdouble w11=0.5;
inputdouble w12=0.5;
string my_symbol; // Variable zum Speichern des Zeichensdouble inputsH[13]; // Array zum Speichern von Eingangssignalendouble inputsL[13]; // Array zum Speichern von Eingangssignalenint periods[13]={2,3,5,8,13,21,34,55,89,144,233,377,610};
int B,Ba;
double weight[13]; // Array zum Speichern von Gewichtskoeffizientendouble High[SIZE],Low[SIZE];
CTrade m_Trade; // Objekt zur Durchführung von Handelsoperationen
CPositionInfo m_Position; // Objekt für Positionsangaben//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+intOnInit()
{
weight[0]=w0;
weight[1]=w1;
weight[2]=w2;
weight[3]=w3;
weight[4]=w4;
weight[5]=w5;
weight[6]=w6;
weight[7]=w7;
weight[8]=w8;
weight[9]=w9;
weight[10]=w10;
weight[11]=w11;
weight[12]=w12;
my_symbol=Symbol();
B=Bars(my_symbol,0);
//--- Rückgabe 0, Initialisierung abgeschlossenreturn(0);
}
//+------------------------------------------------------------------+//| Experten-Deinitialisierungsfunktion|//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{ }
//+------------------------------------------------------------------+//| Experten-Tick-Funktion|//+------------------------------------------------------------------+voidOnTick()
{
double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); // bestes Angebot zum Kaufdouble Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); // bestes Angebot zum Verkauf
B=Bars(my_symbol,0);
if(B!=Ba)
{
CiHigh hi;
CiLow li;
hi.Create(_Symbol,_Period);
li.Create(_Symbol,_Period);
hi.GetData(0,SIZE,High);
li.GetData(0,SIZE,Low);
}
Ba=B;
{
for(int i=0; i<13; i++)
{
int HB = ArrayMaximum(High,SIZE-periods[i],periods[i]);
int LB = ArrayMinimum(Low, SIZE-periods[i],periods[i]);
if(Bid>=High[HB]) inputsH[i] =1;
else inputsH[i]=0;
if(Bid<=Low[LB]) inputsL[i]=1;
else inputsL[i]=0;
}
double outH=CalculateNeuron(inputsH,weight);
double outL=CalculateNeuron(inputsL,weight);
//--- wenn der Ausgangswert des Neurons kleiner als 0 istif(outL>0)
{
//--- wenn es bereits eine Position für dieses Zeichen gibtif(m_Position.Select(my_symbol))
{
//--- und der Typ dieser Position ist Verkaufen, dann schließen Sie sieif(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);
//--- und wenn der Typ dieser Position Kaufen ist, dann beenden.if(m_Position.PositionType()==POSITION_TYPE_BUY) return;
}
//--- wenn Sie hier sind, gibt es keine Position, öffnen Sie sie.
m_Trade.Buy(0.1,my_symbol);
}
//--- wenn der Ausgangswert des Neurons größer als oder gleich 0 istif(outH>0)
{
//--- wenn es bereits eine Position für dieses Zeichen gibtif(m_Position.Select(my_symbol))
{
//--- und der Typ dieser Position ist Kaufen, dann schließen Sie sieif(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol);
//--- und wenn der Typ dieser Position "Verkaufen" ist, dann beenden.if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
}
//--- wenn Sie hier sind, gibt es keine Position, öffnen Sie sie.
m_Trade.Sell(0.1,my_symbol);
}
if(outH>0.0 || outL>0) Print(outH," ",outL);
}
}
//+------------------------------------------------------------------+//|| Neuronenberechnungsfunktion|//+------------------------------------------------------------------+double CalculateNeuron(double &inputs[],double &w[])
{
//--- Variable zur Speicherung der gewichteten Summe der Eingangssignaledouble NET=0.0;
//--- in der Schleife durch die Anzahl der Eingänge die gewichtete Durchschnittssumme der Eingänge ermittelnfor(int n=0;n<ArraySize(inputs);n++)
{
NET+=inputs[n]*w[n];
}
//--- die gewichtete durchschnittliche Summe der Eingaben mit dem additiven Faktor multiplizierenreturn(ActivateNeuron(NET));
}
//+------------------------------------------------------------------+//|| Neuronale Aktivierungsfunktion|//+------------------------------------------------------------------+double ActivateNeuron(double x)
{
//--- Variable zum Speichern des Ergebnisses der Aktivierungsfunktiondouble Out;
//--- hyperbolische Tangensfunktion
Out=(exp(x)-exp(-x))/(exp(x)+exp(-x));
//--- Rückgabe des Wertes der Aktivierungsfunktionreturn(Out);
}
//+------------------------------------------------------------------+
Ich habe diese Eule geschrieben. Können wir sagen, dass es ein neuronales Netzwerk ist, denn ich habe meine Zweifel.
Eule für den Handel in den Kanal.
Algorithmus ist wie folgt: extremums sind für die Anzahl der Fibo-Balken (2,3,5,8,13....) genommen. Für jedes Neuron zu kaufen, zum Beispiel - wenn der Preis unter oder gleich dem Preis des Extremums LOW für einen Zeitraum, dann wieder 1 sonst - 0. Weitere, wie im Beispiel mit NeuronMACD. Zu verkaufen - spiegeln das Gegenteil.
Ich bin für die Kritik an den Code und Algorithmus warten.
Ich habe diese Eule geschrieben. Können wir sagen, dass es ein neuronales Netzwerk ist, denn ich habe meine Zweifel.
Eule für den Handel in den Kanal.
Algorithmus ist wie folgt: extremums sind für die Anzahl der Fibo-Balken (2,3,5,8,13....) genommen. Für jedes Neuron zu kaufen, zum Beispiel - wenn der Preis unter oder gleich dem Preis des LOW Extremum für einen Zeitraum, geben wir 1 sonst - 0. Weitere, wie im Beispiel mit NeuronMACD. Um zu verkaufen - spiegeln Sie das Gegenteil.
Ich warte auf Kritik an dem Code und Algorithmus.
In Ihrem Fall kann die Funktion der Neuronenaktivierung herausgeworfen werden, es ist eine unnötige Bremse.
return(NET);
Es ist kein neuronales Netz, es ist nur ein Perzeptron. Für ein Netzwerk braucht man mindestens ein paar Perceptrons.
Das Fehlen der Details, nach denen ich oben gefragt habe, hat mich als gewöhnlichen Dummkopf bisher verblüfft. Ich habe den Artikel dreimal durchgelesen, aber die notwendigen Antworten nur im Forum gefunden.
Nach einiger Überlegung wurde beschlossen, den zweiten Teil des Artikels zu schreiben.
Im Moment wird der zweite Teil die Arbeit mit mehrschichtigen neuronalen Netzen behandeln.
Wenn Sie Wünsche zum Inhalt haben, schreiben Sie sie bitte kurz auf.
Die Ideen, die ich mit meinen Fingern vermitteln kann, werden im Artikel beschrieben.
Ich danke Ihnen.
Ich nehme "naiv" an, dass es unter russischen Muttersprachlern nicht üblich ist, den Prozess des unabhängigen Lernens als "Parameteranpassung" zu bezeichnen. Ebenso wenig ist es üblich, die Auswahl von Parametern (mit Hilfe von externen Prozessen) für ein beliebiges System als Lernen zu bezeichnen.
Wie auch immer man die Anpassung nennt, sie wird nicht aufhören, eine Anpassung zu sein.
Optimierung, Anpassung und Lernen für neuronale Netze, die mit nicht-stationären Daten arbeiten, sind Synonyme. Denn alle drei Begriffe bedeuten das Gleiche: die Auswahl von Gewichtungskoeffizienten für vergangene historische Daten (Trainingsstichprobe), um Fehler in der Ausgabe des neuronalen Netzes zu minimieren. Wenn es möglich wäre, das Netz mit zukünftigen Daten zu füttern, dann wäre es etwas anderes. Aber in den Geschäften für Büroausstattung gibt es noch keine Zeitmaschinen, also müssen wir die Vergangenheit anpassen.
Wie auch immer Sie eine Anpassung nennen, sie wird nicht aufhören, eine Anpassung zu sein.
Nur eine Frage ist von Interesse: wie kann man ein selbstlernendes Programm erstellen, das ohne einen "externen" Optimierer auskommt. Wenn so etwas in diesem Stadium möglich ist, natürlich.
Das ist ganz einfach. Der EA-Code kann das Netz selbst und seinen Optimierer für die Gewichte enthalten, der automatisch gestartet werden kann, wenn neue Daten eintreffen. Unter neuronalen Netzen verstehen wir in den meisten Fällen solche selbstlernenden Netze. Netze, die extern trainiert werden, zum Beispiel durch den Optimierer des Testers, sind Spielzeuge.
Leute, helft mir! Habe ich richtig verstanden, dass die Normalisierung der Eingabedaten für den gesamten Trainingszeitraum des Netzes durchgeführt werden sollte? Ich meine, die maximalen und minimalen Werte von xi sollten aus dem gesamten Zeitraum genommen werden?
Ich habe diese Eule geschrieben. Können wir sagen, dass es ein neuronales Netzwerk ist, denn ich habe meine Zweifel.
Eule für den Handel in den Kanal.
Algorithmus ist wie folgt: extremums sind für die Anzahl der Fibo-Balken (2,3,5,8,13....) genommen. Für jedes Neuron zu kaufen, zum Beispiel - wenn der Preis unter oder gleich dem Preis des Extremums LOW für einen Zeitraum, dann wieder 1 sonst - 0. Weitere, wie im Beispiel mit NeuronMACD. Zu verkaufen - spiegeln das Gegenteil.
Ich bin für die Kritik an den Code und Algorithmus warten.
Ich habe diese Eule geschrieben. Können wir sagen, dass es ein neuronales Netzwerk ist, denn ich habe meine Zweifel.
Eule für den Handel in den Kanal.
Algorithmus ist wie folgt: extremums sind für die Anzahl der Fibo-Balken (2,3,5,8,13....) genommen. Für jedes Neuron zu kaufen, zum Beispiel - wenn der Preis unter oder gleich dem Preis des LOW Extremum für einen Zeitraum, geben wir 1 sonst - 0. Weitere, wie im Beispiel mit NeuronMACD. Um zu verkaufen - spiegeln Sie das Gegenteil.
Ich warte auf Kritik an dem Code und Algorithmus.
In Ihrem Fall kann die Neuronen-Aktivierungsfunktion ausgeschaltet werden, eine unnötige Bremse.