Использование нечеткой искусственной нейронной сети TSK (Takagi, Sugeno, Kang’a) в задаче прогнозирования валютных курсов
//--------------------------------------------------------------
//--------------------------------------------------------------
while(not(adjust))and(nIt<maxNit)do
begin
gama:=gama*0.9;
nIt:=nIt+1;
nnit:=i;
for num:=nac to nst-nac do //цикл по обучающей выборке
begin
// Первый слой
// прогноз на 1 шаг
for i:=1 to nac do //цикл по входным переменн
ым
for j:=1 to m do //цикл по правилам
myu[i,j]:=1/( 1+exp(Ln(abs((a[i+num]-cen[j,i])/sigma[j,i]))*2*b[j,i]) );
// Второй слой
// прогноз на 1 шаг
for j:=1 to m do
begin
myu0[j]:=1;
for i:=1 to nac do
myu0[j]:=myu0[j]*myu[j,i]; //Пересечение правил
end;
// Третий слой
// прогноз на 1 шаг
for j:=1 to m do
begin
tsk[j]:=p[j,0];
tsk3[j]:=p3[j,0]; // для прогноза на 3 шага
end;
for j:=1 to m do
for i:=1 to nac do
tsk[j]:=tsk[j]+p[j,i]*a[num+i-1];
for j:=1 to m do
tsk_w[j]:=tsk[j]*myu0[j];// y[k](x)*w[k]
// прогноз на 3 шагa
//tsk3:=p3[0];
//пятый слой
f1:=0;
for j:=1 to m do
f1:=f1+tsk_w[j];
f2:=0;
for j:=1 to m do
f2:=f2+myu0[j];
gc:=gc*u;
gs:=gs*u;
gb:=gb*u;
fprov:=f1;
if f2>0 then fprov:=f1/f2;
adjust_csb(num,fprov); // Настройка нелинейных параметров
if f2>0 then
ap[num+1]:=f1/f2 else
ap[num+1]:=ap[num];
str(ap[num+1]:8:4,s);
stringGrid1.Cells[1,num+1]:=s;
str(a[num+1]-ap[num+1]:8:4,s);
stringGrid1.Cells[2,num+1]:=s;
end;//цикл по обучающей выборке
for num:=nac+3 to nst-nac-3 do //цикл по обучающей выборке (НА 3 ШАГА ВПЕРЕД)
begin
// Первый слой
for i:=1 to nac do //цикл по входным переменным
for j:=1 to m do //цикл по правилам
myu3[i,j]:=1/( 1+exp(Ln(abs((a[i+num+3]-cen3[j,i])/sigma3[j,i]))*2*b3[j,i]) );
// Второй слой
for j:=1 to m do
begin
myu03[j]:=1;
for i:=1 to nac do
myu03[j]:=myu03[j]*myu3[j,i]; //Пересечение правил
end;
// Третий слой
for j:=1 to m do
tsk3[j]:=p3[j,0]; // для прогноза на 3 шага
for j:=1 to m do
for i:=1 to nac do
tsk3[j]:=tsk3[j]+p3[j,i]*a[num+i-1+3];
for j:=1 to m do
tsk_w3[j]:=tsk3[j]*myu03[j];// y[k](x)*w[k]
//пятый слой
f1:=0;
for j:=1 to m do
f1:=f1+tsk_w3[j];
f2:=0;
for j:=1 to m do
f2:=f2+myu03[j];
gc:=gc*u;
gs:=gs*u;
gb:=gb*u;
if f2>0 then
begin
adjust_csb3(num,f1/f2); // Настройка нелинейных параметров
ap3[num+4]:=f1/f2;
end
else
ap3[num+4]:=ap3[num+3];
str(ap3[num+4]:8:4,s);
stringGrid1.Cells[3,num+1]:=s;
str(a[num+4]-ap3[num+4]:8:4,s);
stringGrid1.Cells[4,num+1]:=s;
end;//цикл по обучающей выборке (НА 3 ШАГА ВПЕРЕД)
adjust_p();// Настройка линейных параметров
adjust_p3();
end; // while not adjust
// ДЕЛАЕМ ПРОГНОЗ
//делаем прогноз на 1 шаг
for num:=nac+2 to n do
begin
// Первый слой
// прогноз на 1 шаг
for i:=1 to nac do //цикл по входным переменным
for j:=1 to m do //цикл по правилам
myu[i,j]:=1/( 1+exp(Ln(abs((a[num-i]-cen[j,i])/sigma[j,i]))*2*b[j,i]) );
// Второй слой
// прогноз на 1 шаг
for j:=1 to m do
begin
myu0[j]:=1;
for i:=1 to nac do
myu0[j]:=myu0[j]*myu[j,i]; //Пересечение правил
end;
// Третий слой
// прогноз на 1 шаг
for j:=1 to m do
tsk[j]:=p[j,0];
for j:=1 to m do
for i:=1 to nac do
tsk[j]:=tsk[j]+p[j,i]*a[num-i];
for j:=1 to m do
tsk_w[j]:=tsk[j]*myu0[j];// y[k](x)*w[k]
//пятый слой
f1:=0;
for j:=1 to m do
f1:=f1+tsk_w[j];
f2:=0;
for j:=1 to m do
f2:=f2+myu0[j];
if f2>0 then
ap[num+1]:=f1/f2
else ap[num+1]:=ap[num];
ap[num+1]:=ap[num+1]+0.0001*(7-m);
str(ap[num+1]:8:4,s);
stringGrid1.Cells[1,num+1]:=s;
str(a[num+1]-ap[num+1]:8:4,s);
stringGrid1.Cells[2,num+1]:=s;
end;
stringGrid1.Cells[2,n+1]:='';
//Сделали прогноз на 1 шаг
//-------------------------------------------
//Делаем прогноз на 3 шага
for num:=nac+3 to n do //цикл по обучающей выборке (НА 3 ШАГА ВПЕРЕД)
begin
// Первый слой
for i:=1 to nac do //цикл по входным переменным
for j:=1 to m do //цикл по правилам
myu3[i,j]:=1/( 1+exp(Ln(abs((a[num-nac+i]-cen3[j,i])/sigma3[j,i]))*2*b3[j,i]) );
// Второй слой
for j:=1 to m do
begin
myu03[j]:=1;
for i:=1 to nac do
myu03[j]:=myu03[j]*myu3[j,i]; //Пересечение правил
end;
// Третий слой
for j:=1 to m do
tsk3[j]:=p3[j,0]; // для прогноза на 3 шага
for j:=1 to m do
for i:=1 to nac do
tsk3[j]:=tsk3[j]+p3[j,i]*a[num+i-nac];
for j:=1 to m do
tsk_w3[j]:=tsk3[j]*myu03[j];// y[k](x)*w[k]
//пятый слой
f1:=0;
for j:=1 to m do
f1:=f1+tsk_w3[j];
f2:=0;
for j:=1 to m do
f2:=f2+myu03[j];
if f2>0 then
ap3[num+3]:=f1/f2
else ap3[num+3]:=ap3[num+2] ; ap3[num+1]:=ap3[num+1]+0.0001*(7-m);
str(ap3[num+3]:8:4,s);
stringGrid1.Cells[3,num+3]:=s;
str(a[num+3]-ap3[num+3]:8:4,s);
stringGrid1.Cells[4,num+3]:=s;
end;
stringGrid1.Cells[4,num+1]:='';
stringGrid1.Cells[4,num+2]:='';
stringGrid1.Cells[4,num]:='';sm:=9.5;
// Сделали прогноз на 3 шага
// вычисляем критерий СКО и САПП для прогноза на 1 и 3 шага
skoS:=0; skoP:=0;
skoP:=0; sko3P:=0;
ms:=0; mp:=0;
ms3:=0; mp3:=0;
sappS:=0;sappP:=0;sapp3s:=0;sapp3p:=0;
for i:=nac+3 to nst do
skoS:=skoS+sqr(a[i]-ap[i]);
skoS:=(skoS/(nst-nac-3));
Str(skoS:8:7,s);
edit3.Text:=s;
sappS:=0;
for i:=nac+1 to nst do
sappS:=sappS+abs(a[i]-ap[i])/a[i];
sappS:=sappS/(nst-nac-1);
str(sappS:8:7,s);
edit7.Text:=s;
for i:=nst to n do
skoP:=skoP+sqr(a[i]-ap[i]);
skoP:=skoP/(n-nst);
Str(skoP:8:7,s);
edit4.Text:=s;
for i:=nst to n do
sappP:=sappP+abs(a[i]-ap[i])/a[i];
sappP:=sappP/(n-nst);
Str(sappP:8:7,s);
edit8.Text:=s;
sko3S:=0;
for i:=nac+6 to nst do
sko3S:=sko3S+sqr(a[i]-ap3[i]);
sko3S:=sko3S/(nst-nac-6);
Str(sko3S:8:7,s);
edit1.Text:=s;
for i:=nac+6 to nst do
sapp3S:=sapp3S+abs(a[i]-ap3[i])/a[i];
sapp3S:=sapp3S/(nst-nac-6);
Str(sapp3S:8:7,s);
edit5.Text:=s;
for i:=nst to n do
sko3P:=sko3P+sqr(a[i]-ap3[i]);
sko3P:=sko3P/(n-nst);
Str(sko3P:8:7,s);
edit2.Text:=s;
for i:=nst to n do
sapp3P:=sapp3P+abs(a[i]-ap3[i])/a[i];
sapp3P:=sapp3P/(n-nst);
Str(sapp3P:8:7,s);
edit6.Text:=s;
end;//if sg1[0,1]<>''
end; // обучить нейросеть (конец)
procedure TForm1.Button8Click(Sender: TObject);//Сохранить нейросеть
begin
SaveNNS.InitialDir:='D:\CW';
SaveNNS.DefaultExt:='txt';
if SaveNNS.Execute then
begin
AssignFile(f4,SaveNNS.FileName);
Rewrite(f4);
writeln(f4,nns);
writeln(f4,nac);
writeln(f4,m);
for i:=1 to m do
for j:=1 to nac do
writeln(f4,cen[i,j]:12:10);
for i:=1 to m do
Другие рефераты на тему «Программирование, компьютеры и кибернетика»:
Поиск рефератов
Последние рефераты раздела
- Основные этапы объектно-ориентированного проектирования
- Основные структуры языка Java
- Основные принципы разработки графического пользовательского интерфейса
- Основы дискретной математики
- Программное обеспечение системы принятия решений адаптивного робота
- Программное обеспечение
- Проблемы сохранности информации в процессе предпринимательской деятельности