📄 nnd12ls.m
字号:
% PLOT PATH
set(fig,'pointer','watch')
% INITIALIZE TRAINING
Lx = x;
Ly = y;
if option == 1
W1(1,1) = x;
W2(1,1) = y;
elseif option == 2
W1(1,1) = x;
b1(1) = y;
else
b1(1) = x;
b1(2) = y;
end
A1 = logsig(W1*P+b1*ones(1,Q));
A2 = logsig(W2*A1+b2*ones(1,Q));
E = T-A2;
fa=sumsqr(E);
D2 = A2.*(1-A2).*E;
D1 = A1.*(1-A1).*(W2'*D2);
gW1 = D1*P';
gb1 = D1*ones(Q,1);
gW2 = D2*A1';
gb2 = D2*ones(Q,1);
if (option == 1)
nrmo = gW1(1,1)^2 + gW2(1,1)^2;
elseif(option == 2)
nrmo = gW1(1,1)^2 + gb1(1)^2;
else
nrmo = gb1(1)^2 + gb1(2)^2;
end
% NORM OF GRADIENT
nrmrt=sqrt(nrmo);
% INITIALIZE DIRECTION
dW1old=gW1;db1old=gb1;dW2old=gW2;db2old=gb2;
dW1=gW1/nrmrt;db1=gb1/nrmrt;dW2=gW2/nrmrt;db2=gb2/nrmrt;
% ASSIGN PARAMETERS
tau=0.618;
tau1=1-tau;
scaletol=20;
delta=0.32;
delta1=.03;
tol=delta1/scaletol;
scale=2.0;
bmax=26;
n=2; %number of steps before reset
% MAIN LOOP
max_epoch = 3;
disp_freq = 1;
for epoch=1:(max_epoch)
% INITIALIZE A
a=0;
aold=0;
b=delta;
faold=fa;
% CALCULATE INITIAL SSE
W1t = W1; b1t = b1;
W2t = W2; b2t = b2;
if (option == 1)
newx = W1(1,1) + b*dW1(1,1); W1t(1,1) = newx;
newy = W2(1,1) + b*dW2(1,1); W2t(1,1) = newy;
elseif(option == 2)
newx = W1(1,1) + b*dW1(1,1); W1t(1,1) = newx;
newy = b1(1) + b*db1(1); b1t(1) = newy;
else
newx = b1(1) + b*db1(1); b1t(1) = newx;
newy = b1(2) + b*db1(2); b1t(2) = newy;
end
fb = sumsqr(T - logsig(W2t*logsig(W1t*P+b1t*ones(1,Q))+b2t*ones(1,Q)));
% FIND INITIAL INTERVAL WHERE SSE MINIMUM OCCURS
while (fa>fb)&(b<bmax)
aold=a;
faold=fa;
fa=fb;
a=b;
b=scale*b;
if (option == 1)
newx = W1(1,1) + b*dW1(1,1); W1t(1,1) = newx;
newy = W2(1,1) + b*dW2(1,1); W2t(1,1) = newy;
elseif(option == 2)
newx = W1(1,1) + b*dW1(1,1); W1t(1,1) = newx;
newy = b1(1) + b*db1(1); b1t(1) = newy;
else
newx = b1(1) + b*db1(1); b1t(1) = newx;
newy = b1(2) + b*db1(2); b1t(2) = newy;
end
fb = sumsqr(T - logsig(W2t*logsig(W1t*P+b1t*ones(1,Q))+b2t*ones(1,Q)));
xc=circ_x2+newx;
yc=circ_y2+newy;
path = [path; fill(xc,yc,'w','facecolor','none','erasemode','none','EdgeColor','b')];
end
xc=circ_x2+newx;
yc=circ_y2+newy;
path = [path; fill(xc,yc,'w','facecolor','none','erasemode','none','EdgeColor','b')];
a=aold;
fa=faold;
% SHOW INITIAL INTERVAL
if (option == 1)
newx = W1(1,1) + a*dW1(1,1);
newy = W2(1,1) + a*dW2(1,1);
elseif(option == 2)
newx = W1(1,1) + a*dW1(1,1);
newy = b1(1) + a*db1(1);
else
newx = b1(1) + a*db1(1);
newy = b1(2) + a*db1(2);
end
xc=circ_x3+newx;
yc=circ_y3+newy;
path = [path; fill(xc,yc,'k','facecolor','none','erasemode','none','EdgeColor','k')];
if (option == 1)
newx = W1(1,1) + b*dW1(1,1);
newy = W2(1,1) + b*dW2(1,1);
elseif(option == 2)
newx = W1(1,1) + b*dW1(1,1);
newy = b1(1) + b*db1(1);
else
newx = b1(1) + b*db1(1);
newy = b1(2) + b*db1(2);
end
xc=circ_x3+newx;
yc=circ_y3+newy;
path = [path; fill(xc,yc,'k','facecolor','none','erasemode','none','EdgeColor','k')];
% INITIALIZE C AND D
c=a+tau1*(b-a);
if (option == 1)
newx = W1(1,1) + c*dW1(1,1); W1t(1,1) = newx;
newy = W2(1,1) + c*dW2(1,1); W2t(1,1) = newy;
elseif(option == 2)
newx = W1(1,1) + c*dW1(1,1); W1t(1,1) = newx;
newy = b1(1) + c*db1(1); b1t(1) = newy;
else
newx = b1(1) + c*db1(1); b1t(1) = newx;
newy = b1(2) + c*db1(2); b1t(2) = newy;
end
fc = sumsqr(T - logsig(W2t*logsig(W1t*P+b1t*ones(1,Q))+b2t*ones(1,Q)));
xc=circ_x1+newx;
yc=circ_y1+newy;
path = [path; fill(xc,yc,'k','erasemode','none','EdgeColor','k')];
d=b-tau1*(b-a);
if (option == 1)
newx = W1(1,1) + d*dW1(1,1); W1t(1,1) = newx;
newy = W2(1,1) + d*dW2(1,1); W2t(1,1) = newy;
elseif(option == 2)
newx = W1(1,1) + d*dW1(1,1); W1t(1,1) = newx;
newy = b1(1) + d*db1(1); b1t(1) = newy;
else
newx = b1(1) + d*db1(1); b1t(1) = newx;
newy = b1(2) + d*db1(2); b1t(2) = newy;
end
fd = sumsqr(T - logsig(W2t*logsig(W1t*P+b1t*ones(1,Q))+b2t*ones(1,Q)));
xc=circ_x1+newx;
yc=circ_y1+newy;
path = [path; fill(xc,yc,'k','erasemode','none','EdgeColor','k')];
% MINIMIZE ALONG A LINE
k=0;
while (b-a)>tol
if ( (fc<fd)&(fb>=min([fa fc fd])) ) | fa<min([fb fc fd])
b=d; d=c; fb=fd;
c=a+tau1*(b-a);
fd=fc;
if (option == 1)
newx = W1(1,1) + c*dW1(1,1); W1t(1,1) = newx;
newy = W2(1,1) + c*dW2(1,1); W2t(1,1) = newy;
elseif(option == 2)
newx = W1(1,1) + c*dW1(1,1); W1t(1,1) = newx;
newy = b1(1) + c*db1(1); b1t(1) = newy;
else
newx = b1(1) + c*db1(1); b1t(1) = newx;
newy = b1(2) + c*db1(2); b1t(2) = newy;
end
fc = sumsqr(T - logsig(W2t*logsig(W1t*P+b1t*ones(1,Q))+b2t*ones(1,Q)));
xc=circ_x1+newx;
yc=circ_y1+newy;
path = [path; fill(xc,yc,'k','erasemode','none','EdgeColor','k')];
else
a=c; c=d; fa=fc;
d=b-tau1*(b-a);
fc=fd;
if (option == 1)
newx = W1(1,1) + d*dW1(1,1); W1t(1,1) = newx;
newy = W2(1,1) + d*dW2(1,1); W2t(1,1) = newy;
elseif(option == 2)
newx = W1(1,1) + d*dW1(1,1); W1t(1,1) = newx;
newy = b1(1) + d*db1(1); b1t(1) = newy;
else
newx = b1(1) + d*db1(1); b1t(1) = newx;
newy = b1(2) + d*db1(2); b1t(2) = newy;
end
fd = sumsqr(T - logsig(W2t*logsig(W1t*P+b1t*ones(1,Q))+b2t*ones(1,Q)));
xc=circ_x1+newx;
yc=circ_y1+newy;
path = [path; fill(xc,yc,'k','erasemode','none','EdgeColor','k')];
end
end
xc=circ_x1+newx;
yc=circ_y1+newy;
path = [path; plot(xc,yc,'.','color',nnred,'erasemode','none','markersize',15)];
% UPDATE VARIABLES
if (option == 1)
newx = W1(1,1) + a*dW1(1,1); W1(1,1) = newx;
newy = W2(1,1) + a*dW2(1,1); W2(1,1) = newy;
elseif(option == 2)
newx = W1(1,1) + a*dW1(1,1); W1(1,1) = newx;
newy = b1(1) + a*db1(1); b1(1) = newy;
else
newx = b1(1) + a*db1(1); b1(1) = newx;
newy = b1(2) + a*db1(2); b1(2) = newy;
end
% CALCULATE GRADIENT
A1 = logsig(W1*P+b1*ones(1,Q));
A2 = logsig(W2*A1+b2*ones(1,Q));
E = T-A2;
D2 = A2.*(1-A2).*E;
D1 = A1.*(1-A1).*(W2'*D2);
gW1 = D1*P';
gb1 = D1*ones(Q,1);
gW2 = D2*A1';
gb2 = D2*ones(Q,1);
% NORM SQUARE OF GRADIENT
if (option == 1)
nrmn = gW1(1,1)^2 + gW2(1,1)^2;
elseif(option == 2)
nrmn = gW1(1,1)^2 + gb1(1)^2;
else
nrmn = gb1(1)^2 + gb1(2)^2;
end
% CALCULATE DIRECTION
if rem(epoch,n)==0
Z=0;
else
Z=nrmn/nrmo;
end
% CALCULATE NEW DIRECTIONS
dW1new = gW1 + dW1old*Z; db1new = gb1 + db1old*Z;
dW2new = gW2 + dW2old*Z; db2new = gb2 + db2old*Z;
% SAVE NEW DIRECTIONS
dW1old = dW1new; db1old = db1new;
dW2old = dW2new; db2old = db2new;
nrmo=nrmn;
%NORMALIZE DIRECTIONS
if (option == 1)
nrm = sqrt(dW1new(1,1)^2 + dW2new(1,1)^2);
elseif(option == 2)
nrm = sqrt(dW1new(1,1)^2 + db1new(1)^2);
else
nrm = sqrt(db1new(1)^2 + db1new(2)^2);
end
dW1=dW1new/nrm;db1=db1new/nrm;dW2=dW2new/nrm;db2=db2new/nrm;
% DISPLAY PROGRESS
if rem(epoch,disp_freq) == 0
xc=circ_x3+newx;
yc=circ_y3+newy;
Lx = newx;
Ly = newy;
end
end
% OPTIMAL SOLUTIONS
if option == 1
optx = 10;
opty = 1;
elseif option == 2
optx = 10;
opty = -5;
else
optx = -5;
opty = 5;
end
xc=circ_x2+optx;
yc=circ_y2+opty;
path = [path; fill(xc,yc,'w','erasemode','none','EdgeColor','b')];
% CONTOUR PLOT
set(fig,'nextplot','new')
% SAVE DATA
set(path_ptr,'userdata',path);
set(fig,'pointer','arrow')
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -