线性神经网络 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','第一条直线','第二条直线');