"Новый нейронный" - проект Open Source движка нейронной сети для платформы MetaTrader 5. - страница 40

 

Это функции для коэффициентов угла атаки сигмоида:

//+------------------------------------------------------------------+
double ytrans0(double y=0.5)// [0;0.5;1] --> [0;1;500.5] гипербола с перегибом в 0.5
  {
   double x=line0(y);
   return(x>0.5005?0.5005/(1.001-x):x*2.);
  }
//+------------------------------------------------------------------+
double ytrans1(double y=0.)// [-1;0;1] --> [0;1;500.5] сдвинутая гипербола с перегибом в 0.0
  {
   double x=(line1(y)+1.)/2.;
   return(x>0.5005?0.5005/(1.001-x):x*2.);
  }
//+------------------------------------------------------------------+

ЗЫ поясню для чего это писалось:

задача: необходимо регулировать угол атаки сигмоида самими выходами нейронов, выходы в пределах [0;1] либо [-1;1].

Разберём вариант с [0;1]. На участке от 0 до 0.5 требуется уменьшать угол атаки что приводит к падению температуры выхода, на участке от 0.5 до 1 наоборот угол должен возрастать, но главное плавность и без переходов.

Те нужна гипербола с перегибом в заданной срединной точке. Правда для управления углом атаки стоит использовать лишь один выход, либо обрабатывать несколько как среднеарифметическое, иначе будет запирание в сторону угла эмитирующего пороговую функцию.

ЗЗЫ если используется приведённые входы то функции line0() и line1() не нужны, но тогда в ytrans1() нужен сдвиг к диапазону входа [0;1].

 
TheXpert:

Кстати.

Нужна функция сигмоидного типа.

Требования -- нормальный вид самой функции и производной (не сильно сложная в вычислении) и нормальный вид обратной функции и ее производной.

Это обратные приведённому выше сигмоиду функции.

//+------------------------------------------------------------------+
double Invsigma0(double c)//  вход [0;1] обратные
  {
   return(-log((1.-c)/c));
  }
//+------------------------------------------------------------------+
double Invsigma1(double c)//  вход [-1;1]
  {
   return(-log((1.-c)/(1.+c)));
  }
//+------------------------------------------------------------------+
double Dsigma0(double c)//  вход [0;1] производные
  {//exp(-c)/(1+exp(-c))^2
   double e=exp(-c);
   double c2=1.+e;
   return(e/(c2*c2));
  }
//+------------------------------------------------------------------+
double Dsigma1(double c)//  вход [-1;1]
  {// (2*E^-c)/(1+E^-c)^2 
   double e=exp(-c);
   double c2=1.+e;
   return(2.*e/(c2*c2));
  }
//+------------------------------------------------------------------+
double DInvsigma0(double c)// вход [0;1] производные обратной сигмы
  {
   return(1./(c-c*c));
  }
//+------------------------------------------------------------------+
double DInvsigma1(double c)// вход [-1;1]
  {
   return(-2./(c*c-1.));
  }
//+------------------------------------------------------------------+

но у второй нужна проверка, а то можно на #IND нарваться

ЗЫ Я не проверял, всё нужно проверить чтоб не нарваться на #IND

ЗЗЫ сори забыл квадрат, исправил.

 
Urain:
Все 4 функции должны быть определены для всех Х
 
Urain:

Это обратные приведённому выше сигмоиду функции.

но у второй нужна проверка, а то можно на #IND нарваться


Вставь сразу в функцию что то типа:

if(x>0.9999999)
x=1.0;
if(x<-0.9999999)
x=-1.0;
 
joo:

Вставь сразу в функцию что то типа:

Это можно линейные активаторы вызывать, незачем и так путанные формулы ещё путать.

ЗЫ 39 страница, последние две функции line0() и line1().

ЗЗЫ добавил на 39 стр ещё одну функцию проверки Mline() на превышение -#IND #IND

 
Туплю.
 
TheXpert:


 

 

 

А чо? Мне нравится.

Я так понимаю, вопрос об имени уже не стоит?

 
TheXpert:

А чо? Мне нравится.

Я так понимаю, вопрос об имени уже не стоит?

)) 

в процессе развития всё ещё сто раз поменяется как всегда  

 

Вроде все классно, но что-то то ли не то, то ли лишнее, то ли не хватает...

И непонятно почему, т.к. при ближайшем рассмотрении вообще не придерешься.

У тебя есть голова отдельно? на аватарку юзверю?

Или проспаться надоъ. Чем сейчас и займусь. А завтра на щуку.

Причина обращения: