Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Программная модель нейроаппроксиматора

Читайте также:
  1. VI. Стандартная информационная модель
  2. А. Установочная модель
  3. А.2.3.1.2.1. Простая модель ERM
  4. А.2.3.1.2.2. Расширенная модель ERM
  5. Армейская модель и умножение силы у Маркса и у Ленина
  6. Б.2.2. Процедурная модель ARIS для реализации workflow
  7. Б.3.1. Общая процедурная модель

Методы класса TNetManager реализуют логику поведения нейросети в процессе обучения, построения и аппроксимации, т.е. реализуют основные алгоритмы.

class TNetManager

{

public:

double r,p,A,delta,eps;//параметры алгоритма

int Nst;

TNetStream* Stream;//текущий обучаемый поток

double (*XY) [2];//входная выборка

TNetManager(double r,double p,double A,double d,double e, int nst, int sz);

~ TNetManager(){};

void changeMap(double,double*);//изменение параметров сети

double increase(double,double*);//поиск оптимального шага в сторону увеличения

double decrease(double,double*);//поиск оптимального шага в сторону уменьшения

double parabola(double,double,double,double,double*); //поиск оптимального шага в направлении параболы

double countError(double,double*);//вычисление ошибки потока сети с измененными параметрами

double countError();//вычисление ошибки сети до изменения параметров

void Study();//алгоритм обучения потока

};

Алгоритм обучения нейросети начинает работать после указания всех необходимых параметров алгоритма в диалоговом окне.(рисунок 4.4)

Рисунок 4.4 – Диалоговое окно при обучении сети

После запуска процесса обучения система функционирует так, как представлено на рисунке 4.5.

Рисунок 4.5 – Диаграмма состояний нейросети

 

Программная реализация функционирования сети в процессе обучения будет следующей.

// Сформировали набор функций

TList* functionsList = new TList();

functionsList->Add(new TF1());

functionsList->Add(new TF2());

functionsList->Add(new TF3());

//Создали менеджер сети, Взяли базу данных из файла в задачник менеджера сети

Задачник сети представляет собой матрицу (N+1)xP, где N-число переменных функции, P-количество обучающих примеров.

M->Lines->LoadFromFile(leFile->Text);//file with study set (xi,yi)

TNetManager NetMan(StrToFloat(frmStudyNet->ler->Text),StrToFloat(frmStudyNet->lep->Text),StrToFloat(frmStudyNet->leA->Text),StrToFloat(frmStudyNet->led->Text),StrToFloat(frmStudyNet->lee->Text), StrToInt(frmStudyNet->leNst->Text),M->Lines->Count);

for (int i=0;i<M->Lines->Count;i++)

{

int xCharNumber = M->Lines->Strings[i].Pos(";");

int yCharNumber = M->Lines->Strings[i].Length() - M->Lines->Strings[i].Pos(";");

AnsiString xString = M->Lines->Strings[i].SubString(1, xCharNumber - 1);

AnsiString yString = M->Lines->Strings[i].SubString(M->Lines->Strings[i].Pos(";")+1, yCharNumber);

NetMan.XY[i][0]=StrToFloat(xString);

NetMan.XY[i][1]=StrToFloat(yString);

};

//Создали пустую сеть

TNet RBFNet(M->Lines->Count,NetMan.XY);//create net with one stream

//цикл обучения сети

NetMan.Stream=RBFNet.StreamsFirst;//point to one existing stream in empty net

NetMan.Stream->functionList=functionsList;

double H=10;

while (H>StrToFloat(leH->Text))

{

NetMan.Study();

if (RBFNet.StreamsFirst->link!=NULL) NetMan.Stream=RBFNet.AddStream();

H=RBFNet.countError(NetMan.XY);

 

;};

}

Как уже было отмечено ранее обучение сети есть итерационный процесс обучения элементарных структур – «потоков». Схема алгоритма представлена на рисунке 4.6.

Алгоритм обучения потока также реализует класс TNetManager.

void TNetManager::Study(){

double * st=new double[sizeof(this->Stream->alpha0)];

for(int i=0;i<this->Stream->functionList->Count;i++){

TFunction* function = (TFunction*)this->Stream->functionList->Items[i];

int iNst=0;

while(iNst<Nst){

double h0 = 0.1;

this->Stream->initializeMap(function);

double * s = this->Stream->gradient(st);

double Hp = this->countError();

double Hs = this->countError(h0,s);//h0*s + alpha0

if(Hp >= Hs){

changeMap(increase(h0,s),s);

} else {

changeMap(decrease(h0,s),s);

}

iNst++;

}

}

};

Следующий метод вычисляет фунцию ошибки аппроксимации потока.

double TNetManager::countError(double h0, double* s){

double H=0;

double wjk=0;

double wk=0;

double xj=0;

double yj=0;

double an=0;

double ac=0;

int k=0;

for (int j=0;j<sizeof(this->XY[1]);j++)

{

for (k=0;k<sizeof(this->Stream->alpha0)-3;k++)

{

wjk=Stream->alpha0[k]+h0*s[k];

xj=xj+wjk*XY[k][0];

};

wk=Stream->alpha0[k]+h0*s[k];

an=Stream->alpha0[k+1]+h0*s[k+1];

ac=Stream->alpha0[k+2]+h0*s[k+2];

yj=Stream->Neuron->function->execute(xj,an,ac);

H=H+pow(wk*yj-XY[j][1],2);

};

return H;

};

Далее представлены алгоритмы, реализующие градиентный метод поиска оптимального значения шага.

double TNetManager::parabola(double h0,double h1,double h2,double h3,double* s){

bool f1,f2;

double H1=this->countError(h1,s);

double H2=this->countError(h2,s);

double H3=this->countError(h3,s);

int k=0;

while(f1||f2||(k<Nst))

{

double W=(h3+h1)/2-(H3-H1)/((H3-H2)/(h3-h2)-(H2-H1)/(h2-h1));

double Hw=this->countError(W,s);

k++;

if (H2<Hw)

{

if (W>h2)

{

h3=W;

H3=Hw;

}

else

{

h1=W;

H1=Hw;

};

 

 

}

else

{

if (W>h2)

{

h3=h2;

h2=W;

H3=H2;

H2=Hw;

}

else

{

h1=h2;

h2=W;

H1=H2;

H2=Hw;

};

 

 

};

f1= abs(H3-H2)<delta||abs(H2-H1)<delta;

f2= abs(h3-h2)<eps||abs(h2-h1)<eps;

};

return (((H3>H2)?h2:h3)>H1)?h1:((H3>H2)?h2:h3);

};

 

double TNetManager::increase(double h0,double* s){

double h1=0;

double h2=h0;

double h3=r*h0;

bool endFlag=false;

while (!endFlag)

{

double H1=this->countError(h1,s);

double H2=this->countError(h2,s);

double H3=this->countError(h3,s);

if (H3>A)

{

endFlag=true;

}

else

{

if (abs((h3-h2)/h3)<eps&&abs(H3-H2)<delta)

{

endFlag=true;

return (H3>H2)?h2:h3;

}

else

{

bool cmpFlag=false;

while (!cmpFlag)

{

if (H3>H2)

{

endFlag=true;

cmpFlag=true;

return parabola(h0,h1,h2,h3,s);

}

else

{

if (H2<(H3*(h3-h2)+H1*(h2-h1))/(h3-h1))

{

double W=(h3+h1)/2-(H3-H1)/((H3-H2)/(h3-h2)-(H2-H1)/(h2-h1));

if (W>h3)

{

h1=h2;

h2=W;

cmpFlag=true;

}

else

{

h1=h2;

h2=h3;

h3=W;

H1=H2;

H2=H3;

H3=this->countError(h3,s);

};

}

else

{

h1=h2;

h2=h3;

h3=r*h2;

};

 

};

};

 

};

 

};

};

};

 

double TNetManager::decrease(double h0, double* s){

bool parFlag=false;

bool zstFlag=false;

double h1=h0*p;

double h2=0;

double h3=0;

double H2=0;

double H1= this->countError(h1,s);

double H0= this->countError(h0,s);//do not shure

if (h1>eps)

{

zstFlag=true;

if (!parFlag) return 0;

else

{

H2=this->countError(p*h1,s);

if (H0>H2&&H2<H1)

{

h3=h1;

h2=p*h1;

h1=0;

return parabola(h0,h1,h2,h3,s);

}

else return 0;

 

 

};

}

else

{

if (H1<H2)

{

parFlag=true;

}

else

{

H2=this->countError(p*h1,s);

if (H0>H2&&H2<H1)

{

h3=h1;

h2=p*h1;

h1=0;

return parabola(h0,h1,h2,h3,s);

}

else return 0;

 

};

};

};

 

 


Дата добавления: 2015-08-03; просмотров: 72 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Объектная модель RBF-нейросети| За миллиард лет до конца света

mybiblioteka.su - 2015-2024 год. (0.021 сек.)