0
Views
0
Downloads
0
Favorites
#_Lib_Kohhen.mq4
//+------------------------------------------------------------------+
//| #_Lib_Kohhen.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#property library
//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
#define MAXDISTANCE 100000000000
#define RAND_MAX 32767
static double InFreshold=0.0;
static double MaxDistance=MAXDISTANCE;
static int Accreditation=0;
static double LearnRate=0.25;
static int Inhibition=0;
static int MAX_INP; //×èñëî âõîäîâ â ñåòü
static int MAX_NEURON; //×èñëî íåéðîíîâ â ñåòè
double delta[]; //îáó÷åíèå
double inhibitory[]; //Òîðìîæåíèå íåéðîíà
//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
static int dx=0,dy=0; //Ðàçìåð êàðòû
int imax; //Íåéðîí ïîáåäèòåëü
int nx =0,ny=0; //Åãî êîîðäèíàòû
void SetSizeNet(int inp, int neur)
{
MAX_INP =inp;
MAX_NEURON = neur;
ArrayResize(delta,MAX_NEURON);
ArrayResize(inhibitory,MAX_NEURON);
for(int i=0;i<MAX_NEURON;i++)inhibitory[i]=0;
}
void SetShowDim(int _DX, int _DY){dx=_DX; dy=_DY;}
// çàäàåì íà÷àëüíîå óñëîâèå äëÿ ÃÑ×
void srand(){MathSrand(TimeLocal());}
//
double SetLearnRateUL(double lr){double a;a=LearnRate;LearnRate=lr;return (a);}
// èñïîëüçóåì ãàóññèàí äëÿ îïðåäåëåíèÿ ôîðìû
// îáëàñòè îáó÷åíèÿ è ýôôåêòèâíîñòè âîçäåéñòâèÿ
void SetAccreditationUL(int ac){ Accreditation=ac;}
// ÷èñëî öèêëîâ íà êîòîðûå íåéðîí òîðìîçèòñÿ
// ïîñëå âîçáóæäåíèÿ
void SetInhibitionUL(int in){Inhibition=in;}
// ïîðîã âîçáóæäåíèÿ, èíèöèèðóþùèé òîðìîæåíèå
double SetInhibitionFreshold(double f){double a;a=InFreshold;InFreshold=f; return (a);}
//
double SetMaxDistanceUL(double md){double a;a=MaxDistance;if(md<1.0) Accreditation=0;MaxDistance=md;return (a);}
//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
//Çàïîëíÿåì âåñà ñëó÷àéíûìè âåëè÷èíàìè
void LayerUL_Randomize(double & n[][],double range)
{
int i,j;
double p=0.0001;
for( i=0; i<MAX_NEURON;i++ )
{ for( j=0; j<MAX_INP;j++ )
{
n[i][j] =( p+ range*MathRand()/RAND_MAX);
}
}
}
//íîðìàëèçóåì âåñà
void NormalizeSynapses(double & n[][])
{
double s=0;
int i,j;
for(i=0;i<MAX_NEURON;i++)
{
for(j=0;j<MAX_INP;j++)
s+=n[i][j]*n[i][j];
s=MathSqrt(s);
if(s !=0 )
for(j=0;j<MAX_INP;j++)n[i][j]/=s;
}
}
//Íîðìàëèçàöèÿ ìàññèâà çíà÷åíèå
void Normalize(double & mv[])
{
int Size=ArrayRange(mv,0);
double s=0.;
for(int i=0;i<Size;i++)
s+=(mv[i]+0.5)*(mv[i]+0.5);
s=MathSqrt(s);
if(s != 0)
for(i=0;i<Size;i++)
mv[i]=(mv[i]+0.5)/s-0.5;
}
//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
//Ðàñ÷åò ñëîÿ Êðõõåíà
void LayerUL_Propagate(double inputs[],double &n[][],double &axon[])
{
int i,j;
int cx, cy;
double fmax, f;
for(i=0;i<MAX_NEURON;i++)
{
//neurons[i].Propagate();
double state=0.;
for( j=0;j<MAX_INP;j++)
{
state+=(inputs[j])*(n[i][j]);
}
//"Ýêñïîíåíòà áîëåå òåðïèìà ê ïàðàìåòðàì ïðåâûøàþùèì +1;-1 ñ òàíãåíñîì êàê âñåãà âñå ïå÷àëüíî :(
axon[i]=2.0 / (1.0 + MathExp(-state)) - 1;//MathTan(state);
if(Inhibition !=0)
{
if(axon[i]>InFreshold) // âîçáóæäåíèå
{
if(inhibitory[i]<=0) // ïîêà íå çàòîðìîæåí
inhibitory[i]=axon[i]*Inhibition/0.5; // òîðìîçèì
}
// ïîñòåïåííîå âîññòàíîâëåíèå âîçìîæíîñòè âîçáóæäàòüñÿ
if(inhibitory[i]>0) inhibitory[i]--;
}
}
fmax=MAXDISTANCE;
imax=-1;
for(i=0;i<MAX_NEURON;i++)
{
//
double s=0.0;
for(j=0;j<MAX_INP;j++)
s+=MathAbs(inputs[j]-n[i][j]);
delta[i]=s;
//
//f=neurons[i].CountDistance();
f = s;
if(f<fmax)
{
fmax=f;
imax=i;
}
}
//Ìîæíî è òàê çäåëàòü
//imax = ArrayMaximum(axon); //Íàõîäèì íåéðîí ìàêñèìàëüíî îòêëèêíóâøèéñÿ íà ñèãíàë
if(imax==-1){return (false);}
ny=imax/dx; // âû÷èñëåíèå êîîðäèíàò X & Y
nx=imax%dx;
for(i=0;i<MAX_NEURON;i++) delta[i] = 0; //ïîäãîòàâëèâàåì ê ðàáîòå
if(0==Accreditation) //neurons[imax].delta = 1;
{
for(cx=MathMax(nx-MathRound(MaxDistance),0); cx<MathMin(nx+MathRound(MaxDistance+1),dx);cx++)
{
if(dy > 0)
{
for(cy=MathMax(ny-MathRound(MaxDistance),0);cy<MathMin(ny+MathRound(MaxDistance+1),dy);cy++)
{
// íåéðîí â çîíå îáó÷åíèÿ
delta[cy*dx+cx] = 1;
//neurons[cy*dx+cx].delta = 1;
}
}
else
{
delta[cx] = 1;
//neurons[cx].delta = 1;
}
}
}
else //if(Accreditation)
{
for(i=0;i<MAX_NEURON;i++)
{
int y=i/dx;
int x=i%dx;
if(MathAbs(MaxDistance)>=1.0)
{
delta[i] = MathExp(-MathSqrt((nx-x)*(nx-x)+(ny-y)*(ny-y))/MaxDistance);
//neurons[i].delta = exp(-sqrt((nx-x)*(nx-x)+(ny-y)*(ny-y))/MaxDistance);
}
else
Accreditation=0;
//Accreditation = 1;
}
}
// OutSkreenKoh(10,260,delta,"S3");
// Print("minD = ",imax," nx=",nx," ny=",ny);
return (true);
}
//Êîððåêöèÿ îøèáêè
void LayerUL_Learn(double inputs[],double &n[][])
{
int i,j,k;
if(Accreditation==0)
{
for(i=0;i<MAX_NEURON;i++)
{
// ïî íåéðîíàì
if(delta[i] == 0) continue;
// ïî ñèíàïñàì
for(k=0;k<MAX_INP;k++)
{
n[i][k]+=LearnRate*(inputs[k] - n[i][k]);
//layers[j]->neurons[i].synapses[k]+=LearnRate* (layers[j-1]->neurons[k].axon - layers[j]->neurons[i].synapses[k]);
}
}
}
else
{
for(i=0;i<MAX_NEURON;i++)
{
// ïî íåéðîíàì
// çàòîðìîæåííûå ïðîïóñêàåì
if(Inhibition > 0 && inhibitory[i]>0) continue;
// ïî ñèíàïñàì
for(k=0;k<MAX_INP;k++)
{
n[i][k]+=LearnRate * delta[i] * (inputs[k] - n[i][k]);
//layers[j]->neurons[i].synapses[k]+=LearnRate *layers[j]->neurons[i].delta *(layers[j-1]->neurons[k].axon - layers[j]->neurons[i].synapses[k]);
}
}
}
}
//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
//ææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ//
int N=200; //×èñëî öâåòîâ â ïàëèòðå
int rainbow[10000]; //òóò õðàíèòñÿ ðàäóãà
int nRainbow; //÷èñëî öâåòîâ ðàäóãè
int GetRGB(int r, int g, int b)
{//ñòðîèò öâåò ïî êîìïîíåíòàì r, g, b
return (256*(256*b + g) + r);
}
int GetRainbowColor(int c)
{//Âûáèðàåò èç ðàäóãè îòìàñøòàáèðîâàííûé öâåò
double k=nRainbow/N;
int n=c*k;
return (rainbow[n]);
}
int BuildRainbow()
{//ñòðîèò ðàäóãó, âîçâðàùàÿ ÷èñëî öâåòîâ
//âîçìîæíî Âû ïðèäóìàåòå áîëåå âûðàçèòåëüíóþ ïàëèòðó :)
int r=255, g=0, b=0;
int n=0;
while(g !=255)
{
rainbow[n]=GetRGB(r, g, b);
g++; n++;
}
while(r !=0)
{
rainbow[n]=GetRGB(r, g, b);
r--; n++;
}
while(b !=255)
{
rainbow[n]=GetRGB(r, g, b);
b++; n++;
}
while(g !=0)
{
rainbow[n]=GetRGB(r, g, b);
g--; n++;
}
while(r !=255)
{
rainbow[n]=GetRGB(r, g, b);
r++; n++;
}
nRainbow = n;
return (n);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int ObjectMakeLabel( string n,string text, int xoff, int yoff ,color text_color) {
ObjectCreate( n, OBJ_LABEL, 0, 0, 0 );
ObjectSet( n, OBJPROP_CORNER, text_color );
ObjectSet( n, OBJPROP_XDISTANCE, xoff );
ObjectSet( n, OBJPROP_YDISTANCE, yoff );
ObjectSet( n, OBJPROP_BACK, true );
ObjectSetText( n,text, 4, "Webdings", text_color );
}
//âûâîäèì ñîäåðæèìîå êàðòû íà ýêðàí â êîîðäèíàòó ïðàâîãî âåðõíåãî óãëà Sx, Sy
void OutScreenKoh(int x,int y,double arr[],string Marcer)
{
int i=0, j=0;
int k=0;
for(j=0;j<dy;j++)
for(i=0;i<dx;i++)
{
int nc =(arr[k]+1) * 100;
if(nc <0 ) nc = 0;
int col = GetRainbowColor(nc);
ObjectDelete(Marcer+"X"+DoubleToStr(i ,0 )+"Y"+DoubleToStr(j ,0 ));
string str="0";
string text= StringSetChar(str, 0,103);
ObjectMakeLabel( Marcer+"X"+DoubleToStr(i ,0 )+"Y"+DoubleToStr(j ,0 ),text, x+i*4, y+j*4, col);
k++;
}
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---