fyords: Naturalmente, non sono contrario a discutere le sottigliezze delle reti neurali in questo thread, ma in origine l'articolo era pensato per i principianti. Omette alcuni dettagli, perché proprio questi dettagli sono in grado di confondere un neofita delle reti neurali. Naturalmente, l'articolo non specifica i vari metodi di addestramento (fitting) delle reti neurali, ma non è necessario nella fase iniziale. Se vi rendete conto che le reti neurali non sono poi così difficili, non è una scusa per allontanarvi e dire "questo è molto difficile e non fa per me". Se ne sapete di più, è fantastico, ma probabilmente l'articolo non fa per voi.
Finora, è l'assenza di quei dettagli che ho chiesto sopra che mi ha messo, come un normale dummies, in torpore. Ho riletto l'articolo tre volte, ma ho trovato le risposte necessarie solo sul forum.
fyords: Al momento la seconda parte riguarderà il lavoro con le reti neurali multistrato. Se avete dei desideri sul suo contenuto, scriveteli brevemente.
Una sola domanda è interessante: come creare un programma di autoapprendimento che possa fare a meno di un ottimizzatore "esterno". Se una cosa del genere è possibile in questa fase, naturalmente.
Dopo alcune riflessioni, si è deciso di scrivere la seconda parte dell'articolo.
Al momento, la seconda parte riguarderà il lavoro con le reti neurali multistrato. Se avete dei desideri sul contenuto, scriveteli brevemente. Le idee che sarò in grado di trasmettere con le mie dita saranno descritte nell'articolo.
Grazie.
Vorrei che il metodo di apprendimento a gradiente fosse descritto sulle dita.
Presumo "ingenuamente" che tra i madrelingua russi non sia consuetudine chiamare il processo di apprendimento indipendente "adattamento dei parametri". Così come non è accettato chiamare apprendimento la selezione dei parametri (con l'aiuto di processi esterni) per qualsiasi sistema.
Non importa come si chiami l'adattamento, esso non cesserà di essere tale.
Ottimizzazione, adattamento e apprendimento per le reti neurali che trattano dati non stazionari sono sinonimi. Perché tutti e tre i termini significano la stessa cosa: selezione dei coefficienti di ponderazione per i dati storici passati (campione di addestramento) al fine di minimizzare gli errori nell'output della rete neurale. Se fosse possibile alimentare la rete con dati futuri, allora la questione sarebbe diversa. Ma non vendono ancora macchine del tempo nei negozi di attrezzature per ufficio, quindi dobbiamo adattarci al passato.
Una sola domanda è interessante: come creare un programma di autoapprendimento che possa fare a meno di un ottimizzatore "esterno". Se una cosa del genere è possibile in questa fase, ovviamente.
È semplice. Il codice EA può contenere la rete stessa e il suo ottimizzatore di pesi, che può essere lanciato automaticamente quando arrivano nuovi dati. Per reti neurali nella maggior parte dei casi si intendono reti ad autoapprendimento. Le reti addestrate esternamente, ad esempio dall'ottimizzatore del tester, sono giocattoli.
Ragazzi, aiutatemi! Ho capito bene che la normalizzazione dei dati di input deve essere fatta per tutto il periodo di allenamento della rete? Cioè i valori massimi e minimi di xi devono essere presi dall'intero periodo?
net: Ragazzi, aiutatemi! Ho capito bene che la normalizzazione dei dati di input deve essere fatta per tutto il periodo di allenamento della rete? Cioè i valori massimi e minimi di xi devono essere presi dall'intero periodo?
È necessario sull'intero campione di addestramento.
//+------------------------------------------------------------------+//|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"//+------------------------------------------------------------------+//| Funzione di inizializzazione dell'esperto|//+------------------------------------------------------------------+#define SIZE 1000#include <Trade\Trade.mqh> //collegare la libreria per eseguire le operazioni commerciali#include <Trade\PositionInfo.mqh> //collegare la libreria per ottenere informazioni sulle posizioni#include <Indicators/TimeSeries.mqh>//--- valori dei coefficienti di ponderazione 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; // variabile per memorizzare il caratteredouble inputsH[13]; // array per la memorizzazione dei segnali di ingressodouble inputsL[13]; // array per la memorizzazione dei segnali di ingressoint periods[13]={2,3,5,8,13,21,34,55,89,144,233,377,610};
int B,Ba;
double weight[13]; // array per la memorizzazione dei coefficienti di pesodouble High[SIZE],Low[SIZE];
CTrade m_Trade; // oggetto per eseguire operazioni commerciali
CPositionInfo m_Position; // oggetto per le informazioni sulla posizione//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+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);
//--- ritorno 0, inizializzazione completatareturn(0);
}
//+------------------------------------------------------------------+//| Funzione di deinizializzazione dell'esperto|//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{ }
//+------------------------------------------------------------------+//| Funzione tick dell'esperto|//+------------------------------------------------------------------+voidOnTick()
{
double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); // migliore offerta per l'acquistodouble Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); // migliore offerta per la vendita
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);
//--- se il valore di uscita del neurone è inferiore a 0if(outL>0)
{
//--- se esiste già una posizione per questo carattereif(m_Position.Select(my_symbol))
{
//--- e il tipo di questa posizione è Sell, allora chiuderlaif(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);
//--- e se il tipo di posizione è Buy, uscire.if(m_Position.PositionType()==POSITION_TYPE_BUY) return;
}
//--- se siete arrivati qui, non c'è nessuna posizione, apritela.
m_Trade.Buy(0.1,my_symbol);
}
//--- se il valore di uscita del neurone è maggiore o uguale a 0if(outH>0)
{
//--- se esiste già una posizione per questo carattereif(m_Position.Select(my_symbol))
{
//--- e il tipo di questa posizione è Buy, allora chiuderlaif(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol);
//--- e se il tipo di questa posizione è Sell, uscire.if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
}
//--- se siete arrivati qui, non c'è nessuna posizione, apritela.
m_Trade.Sell(0.1,my_symbol);
}
if(outH>0.0 || outL>0) Print(outH," ",outL);
}
}
//+------------------------------------------------------------------+//|Funzione di calcolo dei neuroni|//+------------------------------------------------------------------+double CalculateNeuron(double &inputs[],double &w[])
{
//--- variabile per memorizzare la somma ponderata dei segnali di ingressodouble NET=0.0;
//--- nel ciclo per il numero di ingressi ottenere la media ponderata della somma degli ingressifor(int n=0;n<ArraySize(inputs);n++)
{
NET+=inputs[n]*w[n];
}
//--- moltiplicare la somma media ponderata degli input per il fattore additivoreturn(ActivateNeuron(NET));
}
//+------------------------------------------------------------------+//|Funzione di attivazione del neurone|//+------------------------------------------------------------------+double ActivateNeuron(double x)
{
//--- variabile per memorizzare il risultato della funzione di attivazionedouble Out;
//--- funzione tangente iperbolica
Out=(exp(x)-exp(-x))/(exp(x)+exp(-x));
//--- restituire il valore della funzione di attivazionereturn(Out);
}
//+------------------------------------------------------------------+
Ho scritto questo gufo. Possiamo dire che è una rete neurale, perché ho i miei dubbi.
Gufo per il trading nel canale.
L'algoritmo è il seguente: gli estremi sono presi per il numero di barre Fibo (2,3,5,8,13....). Per ogni neurone da acquistare, ad esempio - se il prezzo è inferiore o uguale al prezzo dell'estremo LOW per un periodo, allora restituisce 1 altrimenti - 0. Inoltre, come nell'esempio con NeuronMACD. Per vendere - rispecchiare il contrario.
Ho scritto questo gufo. Possiamo dire che è una rete neurale, perché ho i miei dubbi.
Gufo per il trading nel canale.
L'algoritmo è il seguente: gli estremi sono presi per il numero di barre Fibo (2,3,5,8,13....). Per ogni neurone da acquistare, ad esempio - se il prezzo è inferiore o uguale al prezzo dell'estremo LOW per un periodo, allora restituisce 1 altrimenti - 0. Inoltre, come nell'esempio con NeuronMACD. Per vendere - rispecchiare il contrario.
Attendo critiche al codice e all'algoritmo.
Nel vostro caso, la funzione di attivazione del neurone può essere buttata via, è un freno inutile.
return(NET);
Non è una rete neurale, è solo un perceptron. Per una rete sono necessari almeno un paio di perceptron.
Finora, è l'assenza di quei dettagli che ho chiesto sopra che mi ha messo, come un normale dummies, in torpore. Ho riletto l'articolo tre volte, ma ho trovato le risposte necessarie solo sul forum.
Dopo alcune riflessioni, si è deciso di scrivere la seconda parte dell'articolo.
Al momento, la seconda parte riguarderà il lavoro con le reti neurali multistrato.
Se avete dei desideri sul contenuto, scriveteli brevemente.
Le idee che sarò in grado di trasmettere con le mie dita saranno descritte nell'articolo.
Grazie.
Presumo "ingenuamente" che tra i madrelingua russi non sia consuetudine chiamare il processo di apprendimento indipendente "adattamento dei parametri". Così come non è accettato chiamare apprendimento la selezione dei parametri (con l'aiuto di processi esterni) per qualsiasi sistema.
Non importa come si chiami l'adattamento, esso non cesserà di essere tale.
Ottimizzazione, adattamento e apprendimento per le reti neurali che trattano dati non stazionari sono sinonimi. Perché tutti e tre i termini significano la stessa cosa: selezione dei coefficienti di ponderazione per i dati storici passati (campione di addestramento) al fine di minimizzare gli errori nell'output della rete neurale. Se fosse possibile alimentare la rete con dati futuri, allora la questione sarebbe diversa. Ma non vendono ancora macchine del tempo nei negozi di attrezzature per ufficio, quindi dobbiamo adattarci al passato.
Qualunque cosa si chiami un adattamento, non cesserà di essere un adattamento.
Una sola domanda è interessante: come creare un programma di autoapprendimento che possa fare a meno di un ottimizzatore "esterno". Se una cosa del genere è possibile in questa fase, ovviamente.
È semplice. Il codice EA può contenere la rete stessa e il suo ottimizzatore di pesi, che può essere lanciato automaticamente quando arrivano nuovi dati. Per reti neurali nella maggior parte dei casi si intendono reti ad autoapprendimento. Le reti addestrate esternamente, ad esempio dall'ottimizzatore del tester, sono giocattoli.
Ragazzi, aiutatemi! Ho capito bene che la normalizzazione dei dati di input deve essere fatta per tutto il periodo di allenamento della rete? Cioè i valori massimi e minimi di xi devono essere presi dall'intero periodo?
Ho scritto questo gufo. Possiamo dire che è una rete neurale, perché ho i miei dubbi.
Gufo per il trading nel canale.
L'algoritmo è il seguente: gli estremi sono presi per il numero di barre Fibo (2,3,5,8,13....). Per ogni neurone da acquistare, ad esempio - se il prezzo è inferiore o uguale al prezzo dell'estremo LOW per un periodo, allora restituisce 1 altrimenti - 0. Inoltre, come nell'esempio con NeuronMACD. Per vendere - rispecchiare il contrario.
Attendo critiche al codice e all'algoritmo.
Ho scritto questo gufo. Possiamo dire che è una rete neurale, perché ho i miei dubbi.
Gufo per il trading nel canale.
L'algoritmo è il seguente: gli estremi sono presi per il numero di barre Fibo (2,3,5,8,13....). Per ogni neurone da acquistare, ad esempio - se il prezzo è inferiore o uguale al prezzo dell'estremo LOW per un periodo, allora restituisce 1 altrimenti - 0. Inoltre, come nell'esempio con NeuronMACD. Per vendere - rispecchiare il contrario.
Attendo critiche al codice e all'algoritmo.
Nel vostro caso, la funzione di attivazione dei neuroni può essere eliminata, un freno inutile.