线性神经网络的应用实例
程序员文章站
2024-03-14 12:20:10
...
线性神经网络的应用实例
形成一个线性方程
方程的个数超过了自变量的个数,因此方程没有精确解,只有近似解,用伪逆的方法可以求的权值限量的值:
P=[0 0 1 1;0 1 0 1];
P=[ones(1,4);P];%输入向量
d=[0 0 0 1];%期望值
Q=pinv(P')*d';
Q =
-0.2500
0.5000
0.5000
用线性网络解:
P=[0 0 1 1;0 1 0 1];
P=[ones(1,4);P];%输入向量
d=[0 0 0 1];%期望值
w=[0 0 0];
lr=maxlinlr(P); %最大学习率
MAX=200; %最大迭代次数
for i=1:MAX
fprintf('第%d次迭代\n',i);
v=w*P;
y=v;
disp('线性神经网络的二至输出:')
yy=y>=0.5;%以0.5 为分界点 对最后的分类面有影响
e=d-y;
m=zeros(1,MAX);
m(i)=mse(e);
fprintf('均方误差: %f\n',m(i));
dw=lr*e*P';
fprintf('权值向量:\n');
w=w+dw
end
%% 显示
plot([0 0 1],[0 1 0],'o');hold on;
plot(1,1,'d');
x=-2:.2:2;
y=1.5-x; %1/2(x+y)-1/4=1/2(为什么不为零,因为上述是以0.5为二值输出分界点)
plot(x,y);
axis([-0.5 2 -0.5 2])
xlable('x');ylable('ylable');
title('线性神经网络用于求解于逻辑');
legend('0','1','分类面');
使用工具箱函数
%% 定义变量
P=[0 0 1 1;0 1 0 1];
d=[0 0 0 1];%期望值
w=[0 0 0];
lr=maxlinlr(P,'bias'); %最大学习率
%% 线性神经网络实现
net_1=linearlayer(0,lr);%线性神经网络
net_1=train(net_1,P,d);
%% 感知器实现
net_2=newp([-1 1;-1 1],1,'hardlim');
net_2=train(net_2,P,d);
%% 显示
disp('线性网络输出');
Y1=sim(net_1,P);
disp('线性网络二值输出');
YY1=Y1>=0.5;
disp('线性网络最终权值:');
w1=[net_1.iw{1,1},net_1.b{1,1}];
disp('感知器输出');
Y2=sim(net_2,P);
disp('线性网络二值输出');
YY2=Y2>=0.5;
disp('线性网络最终权值:');
w2=[net_2.iw{1,1},net_2.b{1,1}];
%% 绘图
plot([0 0 1],[0 1 0],'o');hold on;
plot(1,1,'d');
x=-2:.2:2;
y1=1/2/w1(2)-w1(1)/w1(2)*x-w1(3)/w1(2);
plot(x,y1,'-');
y2=-w2(1)/w2(2)*x-w2(3)/w2(2);%hardlim 函数以0为阈值
plot(x,y2,'--');
axis([-0.5 2 -0.5 2]);
xlabel('x');ylabel('ylabel')
title('线性神经网络用于求解于逻辑');
legend('0','1','线性神经网路分类面','感知器分', '类面');
实现二值异或
%% 定义变量
p1=[0 0 1 1;0 1 0 1];
p2=p1(1,:).^2;
p3=p1(1,:).*p1(2,:);
p4=p1(2,:).^2;
p=[p1(1,:);p2;p3;p4;p1(2,:)]; %添加非线性成分后的输入向量
d=[0 1 1 0];%期望输出向量
lr=maxlinlr(p,'bias');
%% 线性网络实现
net=linearlayer(0,lr);% 创建线性网络
net=train(net,p,d);%线性网络训练
%% 显示
disp('网络输出');
Y1=sim(net,p)
disp('网络二值输出');
YY1=Y1>=0.5
disp('最终权值');
w1=[net.iw{1,1},net.b{1,1}]
plot([0 1],[0 1],'o','LineWidth',2);
hold on;
plot([0 1],[1 0],'o','LineWidth',2);
axis([-0.1 1.1 -0.1 1.1]);
xlabel('x');ylabel('ylabel');
title('线性神经网络用于求解异或i逻辑');
x=-0.1:.1:1.1;y=-0.1:.1:1.1;
N=length(x);
X=repmat(x,1,N);
Y=repmat(y,N,1);Y=Y(:);%将内部所有元素排到一列
Y=Y';
p=[X;X.^2;X.*Y;Y.^2;Y];
yy=net(p);
y1=reshape(yy,N,N);
v=[0.5 0.5];
[C,h]=contour(x,y,y1,v,'b');
clabel(C,h);% 画等高线的高度
legend('0','1','线性神经网络分类面');
Madaline 解线性不可分问题
%% 第一个神经元
p1=[0 0 1 1;0 1 0 1];
d1=[1 0 1 1];
lr=maxlinlr(p1,'bias');
net1=linearlayer(0,lr);
net1=train(net1,p1,d1);
%% 第二个神经元
p2=[0 0 1 1;0 1 0 1];
d2=[1 1 0 1];
lr=maxlinlr(p2,'bias');
net2=linearlayer(0,lr);
net2=train(net2,p2,d2);
Y1=sim(net1,p1);Y1=Y1>=0.5;
Y2=sim(net2,p2);Y2=Y2>=0.5;
Y=~(Y1&Y2);
%% 显示
disp('最一个神经元最终权值:');
w1=[net1.iw{1,1},net1.b{1,1}];
disp('最二个神经元最终权值:');
w2=[net2.iw{1,1},net2.b{1,1}];
disp('第一个神经元测试输出:')
Y1
disp('第二个神经元测试输出:');
Y2
disp('最终输出:');
%% 绘图
plot([0 1],[0 1],'bo');
hold on;
plot([0 1],[1 0],'d');
x=-2:.2:2;
y1=1/2/w1(2)-w1(1)/w1(2)*x-w1(3)/w1(2);
plot(x,y1,'-');
y2=1/2/w2(2)-w2(1)/w2(2)*x-w2(3)/w2(2);
plot(x,y2,'--');
axis([-0.1 1.1,-0.1 1.1]);
xlabel('x');ylabel('y');
title('Madaline用于求解异或逻辑');
legend('0','1','第一条直线','第二条直线');