线性神经网络与非线性神经网络 ,添加非线性成分后的线性神经网络用于求解异或逻辑

线性神经网络
x=-5:5;
y=3*x-7;
randn('state',2);			% 设置种子,便于重复执行
y=y+randn(1,length(y))*1.5;		% 加入噪声的直线
plot(x,y,'o');
P=x;T=y;
lr=maxlinlr(P,'bias')			% 计算最大学习率 加入b偏置
net=linearlayer(0,lr);			% 用linearlayer创建线性层,输入延迟为0
tic;net=train(net,P,T);toc		% 用train函数训练
new_x=-5:.2:5;
new_y=sim(net,new_x);           	% 仿真
hold on;plot(new_x,new_y);
title('linearlayer用于最小二乘拟合直线');
legend('原始数据点','最小二乘拟合直线');
xlabel('x');ylabel('y');
s=sprintf('y=%f * x + %f', net.iw{1,1}, net.b{1,1})  %w值第一个为偏置的权值(net.b),第二个为x.x的权值(net.iw{1,1})第三个为x.y的权值
text(-2,0,s);

非线性神经网络  添加非线性成分后的线性神经网络用于求解异或逻辑
% xor_linearlayer.m
%% 清理
close all
clear,clc
%% 定义变量
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],'d','LineWidth',2);
axis([-0.1,1.1,-0.1,1.1]);
xlabel('x');ylabel('y');
title('线性神经网络用于求解异或逻辑');
x=-0.1:.1:1.1;y=-0.1:.1:1.1;
N=length(x);
X=repmat(x,1,N);  %repmat(A,m,n)功能是以A的内容堆叠在(MxN)
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);
[C,h]=contour(x,y,y1,0.5,'b');
clabel(C,h);
legend('0','1','线性神经网络分类面');

% xor_madaline.m  Madaline用于求解异或逻辑吧 损失函数物理意义划分错误的点到超平面的的距离和
%% 清理
close all
clear,clc
%% 第一个神经元
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('最终输出:');
Y
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);   % 第一条直线,1/2是区分0和1的阈值  %net1.iw{1,1}(1)*x+net1.iw{1,1}(2)*y+net1.b{1,1}=1/2(阈值)
plot(x,y1,'-');
y2=1/2/w2(2)-w2(1)/w2(2)*x-w2(3)/w2(2);   % 第二条直线,1/2是区分0和1的阈值
plot(x,y2,'--');
axis([-0.1,1.1,-0.1,1.1])
xlabel('x');ylabel('y');
title('Madaline用于求解异或逻辑')
legend('0','1','第一条直线','第二条直线');

你可能感兴趣的:(神经网络,非线性神经网络,线性神经网络)