fyords: Я, конечно, не против обсуждения тонкостей нейронных сетей в этой ветке, но изначально, статья планировалась для начинающих. В ней опущены некоторые подробности, ибо именно эти подробности способны ввести в ступор начинающего нейросетивика. Конечно, в статье не указаны различные методы обучения (подгонки) нейронных сетей, но это не является необходимым на начальном этапе. Если понять, что нейронные сети это не так сложно, то это не дает повода отвернуться и сказать "это очень сложно и не для меня". Если Вы знаете больше - это отлично, значит статья, скорей всего, не для Вас.
Пока что именно отсутствие тех подробностей, о которых я вопрошал выше, и ввело меня, как рядового чайника, в ступор. Трижды перечитал статью, но нужные ответы нашёл только на форуме.
fyords: На данный момент во второй части будет освещена работа с многослойными нейронными сетями. Если у Вас имеются пожелания о ее содержимом - прошу, вкратце, напишите их.
Интересует только один вопрос: как создать самообучающуюся программу, которая могла бы обходиться без использования "внешнего" оптимизатора. Если такое, конечно, возможно на данном этапе.
После некоторых раздумий, было принято решение по написанию второй части статьи.
На данный момент во второй части будет освещена работа с многослойными нейронными сетями. Если у Вас имеются пожелания о ее содержимом - прошу, вкратце, напишите их. Те идеи, которые я смогу передать на пальцах будут описаны в статье.
Спасибо.
Хотелось бы, чтобы на пальцах был расписан градиентный метод обучения.
Я "наивно полагаю", что в среде носителей русского языка не принято называть процесс самостоятельного обучения "подгонкой параметров". Равно как и не принято подбор параметров (с помощью внешних процессов) для какой-либо системы называть обучением.
Как подгонку не называй, она от этого подгонкой быть не перестанет.
Оптимизация, подгонка и обучение для нейросетей, имеющих дело с нестационарными данными - это синонимы. Потому что все три термина означают одно и тоже: подбор весовых коэффициентов под прошлые исторические данные (обучающую выборку) с целью минимизации ошибок на выходе нейросети. Если бы имелась возможность подсунуть сетке будущие данные, тогда другое дело. Но машину времени еще пока не продают в магазинах оргтехники, поэтому приходится подгонять под прошлое.
Интересует только один вопрос: как создать самообучающуюся программу, которая могла бы обходиться без использования "внешнего" оптимизатора. Если такое, конечно, возможно на данном этапе.
Всё просто. Код советника может содержать саму сеть и оптимизатор её весов, который может запускаться автоматически при поступлении новых данных. Под нейроными сетями в большинстве случаев как раз и подразумевают такие самообучающие сети. Сети обучаемые извне, например оптимизатором тестера - это игрушки.
Парни, подскажите! Я верно понял, что нормализацию входных данных нужно делать на всем периоде обучения сети? В смысле максимальное и минимальное значения хi брать со всего этого периода?
net: Парни, подскажите! Я верно понял, что нормализацию входных данных нужно делать на всем периоде обучения сети? В смысле максимальное и минимальное значения хi брать со всего этого периода?
//+------------------------------------------------------------------+//| 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"//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+#define SIZE 1000#include <Trade\Trade.mqh> //подключаем библиотеку для совершения торговых операций#include <Trade\PositionInfo.mqh> //подключаем библиотеку для получения информации о позициях#include <Indicators/TimeSeries.mqh>//--- значения весовых коэффициентов 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; // переменная для хранения символаdouble inputsH[13]; // массив для хранения входных сигналовdouble inputsL[13]; // массив для хранения входных сигналовint periods[13]={2,3,5,8,13,21,34,55,89,144,233,377,610};
int B,Ba;
double weight[13]; // массив для хранения весовых коэффициентовdouble High[SIZE],Low[SIZE];
CTrade m_Trade; // объект для выполнения торговых операций
CPositionInfo m_Position; // объект для получения информации о позициях//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+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);
//--- возвращаем 0, инициализация завершенаreturn(0);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{ }
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); // лучшее предложение на покупкуdouble Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); // лучшее предложение на продажу
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);
//--- если значение выхода нейрона меньше 0if(outL>0)
{
//--- если уже существует позиция по этому символуif(m_Position.Select(my_symbol))
{
//--- и тип этой позиции Sell, то закрываем ееif(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);
//--- а если тип этой позиции Buy, то выходимif(m_Position.PositionType()==POSITION_TYPE_BUY) return;
}
//--- если дошли сюда, значит позиции нет, открываем ее
m_Trade.Buy(0.1,my_symbol);
}
//--- если значение выхода нейрона больше или равно 0if(outH>0)
{
//--- если уже существует позиция по этому символуif(m_Position.Select(my_symbol))
{
//--- и тип этой позиции Buy, то закрываем ееif(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol);
//--- а если тип этой позиции Sell, то выходимif(m_Position.PositionType()==POSITION_TYPE_SELL) return;
}
//--- если дошли сюда, значит позиции нет, открываем ее
m_Trade.Sell(0.1,my_symbol);
}
if(outH>0.0 || outL>0) Print(outH," ",outL);
}
}
//+------------------------------------------------------------------+//| Функция вычисления нейрона |//+------------------------------------------------------------------+double CalculateNeuron(double &inputs[],double &w[])
{
//--- переменная для хранения средневзвешенной суммы входных сигналовdouble NET=0.0;
//--- в цикле по количеству входов получаем средневзвешенную сумму входовfor(int n=0;n<ArraySize(inputs);n++)
{
NET+=inputs[n]*w[n];
}
//--- умножаем средневзвешенную сумму входов на добавочный коэффициентreturn(ActivateNeuron(NET));
}
//+------------------------------------------------------------------+//| Функция активации нейрона |//+------------------------------------------------------------------+double ActivateNeuron(double x)
{
//--- переменная для хранения результата функции активацииdouble Out;
//--- функция гиперболического тангенса
Out=(exp(x)-exp(-x))/(exp(x)+exp(-x));
//--- возвращаем значение функции активацииreturn(Out);
}
//+------------------------------------------------------------------+
вот написал такого сова. Можно ли сказать что это нейросеть, а то у меня есть сомнения.
Сова для торговли в канале.
Алгоритм следующий: берутся экстремумы за кол-во баров по Фибо (2,3,5,8,13....). Для каждого нейрона на покупку, к примеру - если Цена ниже или равна цене экстремума LOW для одного периода то возвращаем 1 иначе - 0. дальше, как в примере c NeuronMACD. На продажу - зеркально наоборот.
вот написал такого сова. Можно ли сказать что это нейросеть, а то у меня есть сомнения.
Сова для торговли в канале.
Алгоритм следующий: берутся экстремумы за кол-во баров по Фибо (2,3,5,8,13....). Для каждого нейрона на покупку, к примеру - если Цена ниже или равна цене экстремума LOW для одного периода то возвращаем 1 иначе - 0. дальше, как в примере c NeuronMACD. На продажу - зеркально наоборот.
Жду критики кода и алгоритма.
В вашем случае Функцию активации нейрона можно выкинуть, лишний тормоз.
return(NET);
Это не нейросеть, это просто перцептрон. Для сети надо хотя бы парочку перцептронов.
Пока что именно отсутствие тех подробностей, о которых я вопрошал выше, и ввело меня, как рядового чайника, в ступор. Трижды перечитал статью, но нужные ответы нашёл только на форуме.
После некоторых раздумий, было принято решение по написанию второй части статьи.
На данный момент во второй части будет освещена работа с многослойными нейронными сетями.
Если у Вас имеются пожелания о ее содержимом - прошу, вкратце, напишите их.
Те идеи, которые я смогу передать на пальцах будут описаны в статье.
Спасибо.
Я "наивно полагаю", что в среде носителей русского языка не принято называть процесс самостоятельного обучения "подгонкой параметров". Равно как и не принято подбор параметров (с помощью внешних процессов) для какой-либо системы называть обучением.
Как подгонку не называй, она от этого подгонкой быть не перестанет.
Оптимизация, подгонка и обучение для нейросетей, имеющих дело с нестационарными данными - это синонимы. Потому что все три термина означают одно и тоже: подбор весовых коэффициентов под прошлые исторические данные (обучающую выборку) с целью минимизации ошибок на выходе нейросети. Если бы имелась возможность подсунуть сетке будущие данные, тогда другое дело. Но машину времени еще пока не продают в магазинах оргтехники, поэтому приходится подгонять под прошлое.
Как подгонку не называй, она от этого подгонкой быть не перестанет.
Интересует только один вопрос: как создать самообучающуюся программу, которая могла бы обходиться без использования "внешнего" оптимизатора. Если такое, конечно, возможно на данном этапе.
Всё просто. Код советника может содержать саму сеть и оптимизатор её весов, который может запускаться автоматически при поступлении новых данных. Под нейроными сетями в большинстве случаев как раз и подразумевают такие самообучающие сети. Сети обучаемые извне, например оптимизатором тестера - это игрушки.
Парни, подскажите! Я верно понял, что нормализацию входных данных нужно делать на всем периоде обучения сети? В смысле максимальное и минимальное значения хi брать со всего этого периода?
вот написал такого сова. Можно ли сказать что это нейросеть, а то у меня есть сомнения.
Сова для торговли в канале.
Алгоритм следующий: берутся экстремумы за кол-во баров по Фибо (2,3,5,8,13....). Для каждого нейрона на покупку, к примеру - если Цена ниже или равна цене экстремума LOW для одного периода то возвращаем 1 иначе - 0. дальше, как в примере c NeuronMACD. На продажу - зеркально наоборот.
Жду критики кода и алгоритма.
вот написал такого сова. Можно ли сказать что это нейросеть, а то у меня есть сомнения.
Сова для торговли в канале.
Алгоритм следующий: берутся экстремумы за кол-во баров по Фибо (2,3,5,8,13....). Для каждого нейрона на покупку, к примеру - если Цена ниже или равна цене экстремума LOW для одного периода то возвращаем 1 иначе - 0. дальше, как в примере c NeuronMACD. На продажу - зеркально наоборот.
Жду критики кода и алгоритма.
В вашем случае Функцию активации нейрона можно выкинуть, лишний тормоз.