Kohonen EA

#define I_NET  15

#define O_NET  15

#define DHIST 100

//+------------------------------------------------------------------+

double in_net[I_NET],out_net[O_NET],ww[I_NET][O_NET],WW0[I_NET],in_data[DHIST][I_NET];

int    CountClass[O_NET];

string ss,sss;

//+------------------------------------------------------------------+

int start()

{

  SetWeights();   //èíèöèàëèçàöèÿ íà÷àëüíûõ âåñîâ

  TeachNET();     //îáó÷åíèå

//--- èñïîëüçîâàíèå ñåòè (ïðîâåðêà) -------------------------------

  for(int i=0; i<DHIST; i++)

  {

    Fill_IN(i);      //âõîäíûå äàííûå

    int Y=Net();     //ãîòîâàÿ ñåòü

    CountClass[Y]++; //ïîñ÷èòàåì êîëè÷åñòâà êëàññîâ

    ObjectCreate (""+Time[i],OBJ_TEXT,0,Time[i],High[i]+15*Point);

    ObjectSetText(""+Time[i],""+Y,14,"Times New Roman",Yellow);

  }

  sss=sss+"\n\nÊîëè÷åñòâî êëàññîâ â êàæäîé êàòåãîðèè\n";

  for(int j=0; j<O_NET; j++)

  {

    sss=sss+DoubleToStr(j,0)+" - "+CountClass[j]+"\n";

  }

  Comment(sss);

  return(0);

}

//-------------------------------------------------------------------+

int Net()

{

  for(int j=0; j<O_NET; j++)

  {

    out_net[j]=0;

    for(int i=0; i<I_NET; i++) out_net[j]+=MathPow((in_net[i]-ww[i,j]),2);

  }

  return(ArrayMinimum(out_net)); //îïðåäåëåíèå íåéðîíà-ïîáåäèòåëÿ ïî Êîõîíåíó

}

//+------------------------------------------------------------------+

void SetWeights()

{

  double  x2;

  int     h=FileOpen("IN_DATA.csv",FILE_CSV|FILE_WRITE,';');

  for(int k=0; k<DHIST; k++)

  {

    x2=0;

    string sdata="";

    for(int i=0; i<I_NET; i++)

    {

      in_data[k,i]=Data(k,i);

      sdata=sdata+in_data[k,i]+";";

      x2+=MathPow(in_data[k,i],2);//ñîáèðàåì ñóììó êâàäðàòîâ äëÿ äàëüíåéøåé íîðìàëèçàöèè ê åäèíè÷íîìó âåêòîðó

    }

    sdata=sdata+";";

//--- íîðìàëèçàöèÿ ê åäèíè÷íîìó âåêòîðó ---

    x2=MathSqrt(x2);

    for(i=0; i<I_NET; i++)

    {

      in_data[k,i]=in_data[k,i]/x2; 

      sdata=sdata+in_data[k,i]+";";

    }

//-----------------------------------------

    FileWrite(h,sdata);

  }

  FileClose(h);

/*

  double N=1.0/MathSqrt(O_NET);  //âûïóêëàÿ êîìáèíàöèÿ

  ArrayInitialize(WW0,N);

  double step=1.0/(DHIST+1);

  for(i=0; i<I_NET; i++)

  {

    double alfa=0;

    for(k=0; k<DHIST; k++)

    {

      WW0[i]=WW0[i]+(alfa*in_data[k,i]+(1.0-alfa)*N);// /DHIST;

      Comment(alfa,"  -  ",WW0[0],"  ",WW0[1],"  ",WW0[2],"  ",WW0[3],"  ",WW0[4],"  ",WW0[5],"  ",WW0[6],"  ",WW0[7],"  ",WW0[8],"  ",WW0[9],"  ",WW0[10],"  ",WW0[11],"  ",WW0[12],"  ",WW0[13],"  ",WW0[14]);

      alfa+=step;

    }

    WW0[i]/=DHIST;

  }

*/

  ArrayInitialize(WW0,0);  //ñðåäíåå

  for(i=0; i<I_NET; i++)

  {

    for(k=0; k<DHIST; k++)

    {

      WW0[i]=WW0[i]+in_data[k,i]/DHIST;

      Comment("  ",WW0[0],"  ",WW0[1],"  ",WW0[2],"  ",WW0[3],"  ",WW0[4],"  ",WW0[5],"  ",WW0[6],"  ",WW0[7],"  ",WW0[8],"  ",WW0[9],"  ",WW0[10],"  ",WW0[11],"  ",WW0[12],"  ",WW0[13],"  ",WW0[14]);

    }

  }

  ss="Íà÷àëüíûå âåñà\n";

//--- ïðèñâàèâàåì ïîëó÷åííûå íà÷àëüíûå âåñà ñèíàïñàì -------------------------------

  for(int j=0; j<O_NET; j++)

  {

    for(i=0; i<I_NET; i++) ww[i,j]=WW0[i]; //íà÷àëüíûå âåñà ñèíàïñîâ

    ss=ss+"Íåéðîí "+j+"  "+DoubleToStr(ww[j,j],4)+"\n";

  }

  ss=ss+"\n\n";

//----------------------------------------------------------------------------------

  string s="";

  for(i=0; i<I_NET; i++) s=s+WW0[i]+";";

  h=FileOpen("WEIGHTS.csv",FILE_CSV|FILE_WRITE,';');

  FileWrite(h,s);

  FileClose(h);

  

  return(0);

}

//+------------------------------------------------------------------+

void TeachNET()

{

  int    Epoch=50;

  int    Radius=(O_NET/2+O_NET%2),Rmax,Rmin,Rstep,Rchange;  //îêðåñòíîñòü âûèãðàâøåãî íåéðîíà

  int    e,i,j,k,class;

  int    wincnt_max=DHIST/(O_NET),wincnt[O_NET];            //áóäåì ñ÷èòàòü è òîðìîçèòü ÷àñòî âûèãðûâàþùèé íåéðîí

  double alfa,step;

  alfa=0.5/O_NET;         //ñêîðîñòü îáó÷åíèÿ

  step=alfa/(Epoch+1);    //èçìåíåíèå ñêîðîñòè îáó÷åíèÿ

  Rstep=Epoch/Radius;     //øàã èçìåíåíèÿ ðàäèóñà îêðåñòíîñòè

  Rchange=Rstep;          //çàäàëè íà÷àëüíóþ ãðàíèöó èçìåíåíèÿ ðàäèóñà îêðåñòíîñòè

  for(e=0; e<Epoch; e++)

  {

    ArrayInitialize(wincnt,0);

    if(Radius>0 && e>Rchange) { Radius--; Rchange+=Rstep; }

    for(k=1; k<DHIST; k++)

    {

      Fill_IN(k);            //çàïîëíåíèå âõîäíîãî ìàññèâà äàííûõ

      for(j=0; j<O_NET; j++)

      {

        out_net[j]=0;

        for(i=0; i<I_NET; i++) out_net[j]+=MathPow(in_net[i]-ww[i,j],2);

      

      

      }

      class=ArrayMinimum(out_net);

      if(wincnt[class]>wincnt_max) //òîðìîæåíèå ÷àñòî âûèãðûâàþùåãî íåéðîíà

      {

        out_net[class]=999;

        class=ArrayMinimum(out_net);

      }

      wincnt[class]++;

      Print("class  ",wincnt[class]);

      Rmax=class+Radius; Rmin=class-Radius;

      sss="Ýïîõ  "+DoubleToStr(e+1,0)+"  ("+DoubleToStr(Epoch,0)+")   "+DoubleToStr(k,0)+"  alfa "+DoubleToStr(alfa,6)+"  Radius "+DoubleToStr(Radius,0)+"   Rmax="+DoubleToStr(Rmax,0)+"   Rmin="+DoubleToStr(Rmin,0)+"\n\n"+ss+"\nÍàñòðîéêà âåñîâ\n";

      for(j=0; j<O_NET; j++) //Ïîäñòðîéêà âåñîâ íåéðîíîâ

      {

        if(Radius>0 && (j<Rmin || j>Rmax)) continue;

        sss=sss+"Íåéðîí "+DoubleToStr(j,0)+"  ";

        for(i=0; i<I_NET; i++)

        {

          if(Radius>0)

            ww[i,j]=ww[i,j]+alfa*(in_net[i]-ww[i,j]);

          else if(j==class)

            ww[i,j]=ww[i,j]+alfa*(in_net[i]-ww[i,j]);//ìåòîä îáó÷åíèå Êîõîíåíà

          sss=sss+DoubleToStr(ww[i,j],4)+"  ";

        }

       

        sss=sss+"\n";

      

      }

      Comment(sss);

    }

    alfa-=step;

  }

  return(0);

}

//+------------------------------------------------------------------+

void Fill_IN(int k)

{

  double x2=0;

  for(int i=0; i<I_NET; i++)

  {

    in_net[i]=Data(k,i);

    x2+=MathPow(in_net[i],2);

  }

  x2=MathSqrt(x2);

  for(i=0; i<I_NET; i++) in_net[i]/=x2; //ïðèâåäåíèå ê åäèíè÷íîìó âåêòîðó

  return(0);

}

//+------------------------------------------------------------------+

double Data(int k, int i)

{

  double y=0;

  if(i>= 0 && i< 5) y=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,k+i)-Open[k+i];

  if(i>= 5 && i<10) y=iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,k+i)-Open[k];

  if(i>=10 && i<15) y=Open[k+i]-Open[k];

/*

  if(i>= 0 && i< 5) y = Close[k+i] - Open[k+i];

  if(i>= 5 && i<10) y =  Open[k+i] -  Low[k+i];

  if(i>=10 && i<15) y =  Open[k+i] - Open[k];

*/

  

  

  

  

  return(y);

}

//+------------------------------------------------------------------+

int init()

{

  ObjectsDeleteAll(); Comment("");

  return(0);

}

//+------------------------------------------------------------------+

int deinit() { return(0); }

//+------------------------------------------------------------------+