Смекни!
smekni.com

Использование нечеткой искусственной нейронной сети TSK Takagi Sugeno Kanga в задаче прогнозирования (стр. 13 из 14)

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:&bsol;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

for j:=1 to nac do

writeln(f4,sigma[i,j]:12:10);

for i:=1 to m do

for j:=1 to nac do

writeln(f4,b[i,j]:12:10);

for i:=1 to m do

for j:=0 to nac do

if j<=nac then

writeln(f4,p[i,j])else begin

end;

for i:=1 to m do

for j:=1 to nac do

writeln(f4,cen3[i,j]:12:10);

for i:=1 to m do

for j:=1 to nac do

writeln(f4,sigma3[i,j]:12:10);

for i:=1 to m do

for j:=1 to nac do

writeln(f4,b3[i,j]:12:10);

for i:=1 to m do

for j:=0 to nac do

if j<=nac then

writeln(f4,p3[i,j])else begin end;

CloseFile(f4);

end;//if

end;//Сохранить нейросеть (конец)

// RUN

procedure TForm1.Button9Click(Sender: TObject);

var s:string;

l,nc:integer;//l - номер центра; nc - количество центров;

num,q:integer;//Количество итераций

nIt:longint;

sum,gama,pz,pz1,d,yP,x,sk:real; //y прогнозированное

tsk_w,tsk_w3,tsk,tsk3:array[1..mM]of real;//отвечает за третий слой

f1,f2,s_sign,s_w,s_sign3,s_w3:real;// взвешенная сумма сигналов и весов

begin

for q:=1 to n do

begin

s:=StringGrid1.Cells[0,q];

for k:=1 to Length(s) do

if (s[k]='.')or(s[k]=',') then s[k]:=decimalSeparator;

a[q]:=strToFloat(s);

end;

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 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];

ap[num+1]:=f1/f2;

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];

ap3[num+3]:=f1/f2;

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]:='';

// Сделали прогноз на 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;// RUN

end.

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls, Mask,Grids;

type

TForm2 = class(TForm)

Button1: TButton;

Button2: TButton;

Splitter1: TSplitter;

StaticText1: TStaticText;

StaticText2: TStaticText;

Bevel1: TBevel;

Bevel2: TBevel;

StaticText4: TStaticText;

StaticText5: TStaticText;

StaticText6: TStaticText;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

Memo1: TMemo;

Label1: TLabel;

Edit5: TEdit;

Label2: TLabel;

procedure Button2Click(Sender: TObject);

procedure FormResize(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Edit1KeyPress(Sender: TObject; var Key: Char);

procedure Edit2KeyPress(Sender: TObject; var Key: Char);

procedure Edit3KeyPress(Sender: TObject; var Key: Char);

procedure Edit4KeyPress(Sender: TObject; var Key: Char);

procedure FormPaint(Sender: TObject);

procedure Edit5KeyPress(Sender: TObject; var Key: Char);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

// f: TextFile;

//n,nst,nac,neps,nrp:integer;

s:string;

sw:array[1..20]of string;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.Button2Click(Sender: TObject);

begin //Закрыть форму

Form2.close;

end;

procedure TForm2.FormResize(Sender: TObject);

begin

Button2.Top:=Form2.ClientHeight-Button2.Height-8;

Button1.Top:=Form2.ClientHeight-Button2.Height*2-16;

end;

procedure TForm2.FormCreate(Sender: TObject);

var i:integer;

begin

edit1.Text:='';

edit2.Text:='';

edit3.Text:='';

edit4.Text:='';

edit5.Text:='';

if nst>n then nst:=trunc(n/2);

str(Nst,s);

edit1.Text:=s;

if nac>nst then nac:=4;

str(Nac,s);

edit2.Text:=s;

if (neps<1)or(neps>1000)then neps:=10;

str(Neps,s);

edit3.Text:=s;

if(nrp<10)or(nrp>99)then nrp:=80;

str(Nrp,s);

edit4.Text:=s;

if (m>mM)or(m<1)then m:=5;

Form2.Memo1.Lines.Clear;

for i:=1 to nac do

Form2.Memo1.Lines[i-1]:=sw[i]+#13#10;

end;//Form2.create;

procedure TForm2.Button1Click(Sender: TObject);//Сохранить и выйти

begin

s:=edit1.Text;

nst:=abs(StrToInt(s));

if (nst>n)or(nst<2) then nst:=trunc(n/2);

s:=edit2.Text;

nac:=StrToInt(s);

s:=edit3.Text;

neps:=abs(StrToInt(s));

if (neps<1)or(neps>1000)then neps:=10;

s:=edit4.Text;

nrp:=StrToInt(s);

if(nrp<10)or(nrp>99)then nrp:=80;

s:=edit5.Text;

m:=StrToInt(s);

if (m>mM)or(m<1)then m:=5;

Form2.close;

end;//Сохранить и выйти (конец)

procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);

begin

if key=#13then

begin

s:=edit1.Text;

nst:=StrToInt(s);

if nst>n then nst:=trunc(n/2);

end;

if not(Key in [#8,'0'..'9'])then

Key:=#0;

end;

procedure TForm2.Edit2KeyPress(Sender: TObject; var Key: Char);

begin

if key=#13then

begin

s:=edit2.Text;

nac:=StrToInt(s);

if nac>nst then nac:=4;

end;

if not(Key in [#8,'0'..'9'])then

Key:=#0;

end;

procedure TForm2.Edit3KeyPress(Sender: TObject; var Key: Char);

begin

if key=#13then

begin

s:=edit3.Text;

Neps:=StrToInt(s);

if (neps<1)or(neps>1000)then neps:=10;

end;

if not(Key in [#8,'0'..'9'])then

Key:=#0;

end;

procedure TForm2.Edit4KeyPress(Sender: TObject; var Key: Char);

begin

if key=#13then

begin

s:=edit4.Text;

nrp:=StrToInt(s);

if(nrp<10)or(nrp>99)then nrp:=80;

end;

if not(Key in [#8,'0'..'9'])then

Key:=#0;

end;

procedure TForm2.FormPaint(Sender: TObject);

var i:integer;

begin

edit1.Text:='';

edit2.Text:='';

edit3.Text:='';

edit4.Text:='';

if nst>n then nst:=trunc(n/2);

str(Nst,s);

edit1.Text:=s;

str(Nac,s);

edit2.Text:=s;

if (neps<1)or(neps>1000)then neps:=10;

str(Neps,s);

edit3.Text:=s;

if(nrp<10)or(nrp>99)then nrp:=80;

str(Nrp,s);

edit4.Text:=s;

if(m<1)or(m>mM)then m:=5;

str(m,s);

edit5.Text:=s;

Form2.Memo1.Lines.Clear;

Form2.Memo1.Lines[0]:='Весовые коэфициенты при прогнозированнии на 1 шаг'+#13#10;

for i:=1 to nac do

begin

str(w[i]:6:5,sw[i]);

Form2.Memo1.Lines[i]:=sw[i]+#13#10;

end;

Form2.Memo1.Lines[nac+1]: =' Весовые коэфициенты при прогнозированнии на 3 шагa'+#13#10;

for i:=1 to nac do

begin

str(w3[i]:6:5,sw[i]);

Form2.Memo1.Lines[nac+i+1]:=sw[i]+#13#10;

end;

//Form2.Memo1.Lines[nac+1]:=form1.nnit+#13#10;

end;

procedure TForm2.Edit5KeyPress(Sender: TObject; var Key: Char);

begin

if key=#13then

begin

s:=edit5.Text;

m:=StrToInt(s);

if (m>mM)or(m<1)then m:=5;

end;

if not(Key in [#8,'0'..'9'])then

Key:=#0;

end;

end.

unit Unit3;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm3 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

procedure FormResize(Sender: TObject);

procedure FormActivate(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

const cc=0; dd=24;

var

Form3: TForm3;

i,j,k:integer;

max,min:real;

var d,xlong,ylong,u0x,u0y,w,h,wm,hm:integer;

s,inform:string;

implementation

uses Unit1;

{$R *.dfm}

//close

procedure TForm3.Button1Click(Sender: TObject);

begin

form3.Close;

end;

//fi

function fi(g:real):integer;

var h:real;

begin

h:=u0x-(g-min)*u0x/(max-min);

fi:=trunc(h);

end;

//Resize

procedure TForm3.FormResize(Sender: TObject);

var h:integer;

begin

max:=0;

min:=10000;

for i:=1 to n do

begin

if a[i]>max then max:=a[i];

if a[i]<min then min:=a[i];

end;

Button1.Top:=Form3.ClientHeight-Button1.Height-8;

Form3.Refresh;

wm:=Form3.clientWidth;

hm:=Form3.clientHeight;

d:=1;

//Область рисования графика

with form3.canvas do

begin

Pen.color:=clblack;

Brush.Color:=clWhite;

Brush.Style:=bsSolid;

u0x:=hm-32-button1.height;

u0y:=32;

rectangle(dd,cc,wm-8,hm-16-button1.height);

xlong:=wm-u0y-16;

ylong:=u0x-8;

if n=0 then n:=1;

d:=trunc(xlong/n);

if d=0 then d:=1;

Pen.color:=clgreen; //вывод а

moveTo(u0y,fi(a[1]));

for i:=2 to n do

begin

moveTo(u0y+d*(i-1),fi(a[i-1]));

lineTo(u0y+d*i,fi(a[i]));

end;

Pen.color:=clred; //вывод ар

for i:=nac+3 to n do

begin

moveTo(u0y+d*(i-1),fi(ap[i-1]));

lineTo(u0y+d*i,fi(ap[i]));

end;

//вывод сетки и подписей

i:=trunc(min/10);

j:=trunc(max/10);

k:=i*10+5;

j:=j*10;

font.color:=clBlack;

font.Size:=14;

while k<=j+1 do

begin

inform:=IntTostr(k);

TextOut(1,fi(k),inform);

k:=k+5;

end;

font.Size:=10;

TextOut(Button1.Width+20,u0x+20,'Имя файла: '+fname);

TextOut(Button1.Width+20,u0x+40,'Зеленый - реальные данные; красный - спрогнозированные');

end;//with form3.canvas do

end;//form3.Resize

//Form3.active

procedure TForm3.FormActivate(Sender: TObject);

begin

max:=0;

min:=10000;

for i:=1 to n do

begin

if a[i]>max then max:=a[i];

if a[i]<min then min:=a[i];

end;

Button1.Top:=Form3.ClientHeight-Button1.Height-8;

Form3.Refresh;

wm:=Form3.clientWidth;

hm:=Form3.clientHeight;

d:=1;

//Область рисования графика

with form3.canvas do

begin

Pen.color:=clblack;

Brush.Color:=clWhite;

Brush.Style:=bsSolid;

u0x:=hm-32-button1.height;

u0y:=32;

rectangle(dd,cc,wm-8,hm-16-button1.height);

xlong:=wm-u0y-16;

ylong:=u0x-8;

if n=0 then n:=1;

d:=trunc(xlong/n);

if d=0 then d:=1;

Pen.color:=clgreen;

moveTo(u0y,fi(a[1]));

for i:=2 to n do

begin

moveTo(u0y+d*(i-1),fi(a[i-1]));

lineTo(u0y+d*i,fi(a[i]));

end;

Pen.color:=clred;

for i:=nac+3 to n do

begin

moveTo(u0y+d*(i-1),fi(ap[i-1]));

lineTo(u0y+d*i,fi(ap[i]));

end;

//вывод сетки и подписей

i:=trunc(min/10);

j:=trunc(max/10);

k:=i*10+5;

j:=j*10;

font.color:=clBlack;

font.Size:=14;

while k<=j+1 do

begin

inform:=IntTostr(k);

TextOut(1,fi(k),inform);

k:=k+5;

end;

font.Size:=10;

TextOut(Button1.Width+20,u0x+20,'Имя файла: '+fname);

TextOut(Button1.Width+20,u0x+40,'Зеленый - реальные данные; красный - спрогнозированные');

end;//with form3.canvas do

end; // form3.active

procedure TForm3.FormCreate(Sender: TObject);

begin

end;

end.

unit matrices;

interface

Uses SysUtils;

type