%% bus driver
%
clc
clear
close all
%% net config
X = [ 1,0,0,0;
0,1,0,0;
0,0,1,0;
0,0,0,1; ] ;
label = 0;
f = @(x) 1./(1+exp(-x));
getx = @() X(:,randi([1,4]));
delta = @(i,j) i==j;
alpha = 5.0;
p1 = zeros(2,7);
p2 = zeros(2,7);
w = 1 - 2*rand(2,7);
%% train
x = getx();
y = zeros(2,1);
z = [y;x;1];
s = w*z;
y = f(s);
error = [ ];
n = 0;
% figure;
% hold on ;
for n = 1:5000
x = getx();
z = [y;x;1];
d = 0;
if(x(1) == 1)
label = 1;
end;
if(label && x(2) == 1)
d = 1 ;
label = 0;
end;
s = w*z;
y = f(s);
for i = 1:2
for j = 1:7
q1 = f(s(1))*(1-f(s(1)))*(w(1,1)*p1(i,j)+w(1,2)*p2(i,j)+delta(1,i)*z(j));
q2 = f(s(2))*(1-f(s(2)))*(w(2,1)*p1(i,j)+w(2,2)*p2(i,j)+delta(2,i)*z(j));
p1(i,j) = q1;
p2(i,j) = q2;
end;
end;
err = (d - y(2));
error = [error,1/2*(err*err)];
% plot(error,'-b');
% pause(0.00001);
w = w + alpha*err*p2;
end;
plot(error,'-b')
%% test
pass = 0;
y = zeros(2,1);
x = getx();
z = [y;x;1];
s = w*z;
y = f(s);
for n = 1:1000
x = getx();
z = [y;x;1];
s = w*z;
y = f(s);
d = 0;
if(x(1) == 1)
label = 1;
end;
if(label && x(2) == 1)
d = 1;
label = 0;
end;
if ( abs(d - y(2))<0.5 )
pass = pass + 1;
else
x
d
n
end;
end;
pass
w
%% Note:
%1.使用 动态画图,查看err达到查看更新是否收敛的目的
% 画图的运算速度回很慢,可以不动态画图,而是最后查看误差的plot,查看是否收敛
%2.ab 和 a****b的问题:
% 自己读论文得到的理解仅仅是ab的问题,而不是a**b的问题的思考;
% 默认是思考 简单的情况
%3.对test程序的理解
% 可以加入作者的weight测试自己的test程序是否正确
% 如果用作者的weight都不通过,test程序肯定有错
%4.对err图的思考:
% 当err图显示不收敛的时候test的错误率就大
RNN3: bus driver 问题
最新推荐文章于 2024-03-30 23:16:07 发布