继上一篇-神经网络-非线性问题的处理-二分类

因为上一篇张有些图片发不出来,现在这补充:

1. 二分类问题图示:

2.sigmoid函数图示:

3.神经网络模型图:

4.运行结果代码截图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
function main() InDim=2; % 样本输入维数 OutDim=3; % 样本输出维数 % figure % colordef(gcf,'white') % echo off % clc % axis([-2,2,-2,2]) % axis on % grid % xlabel('Input x'); % ylabel('Input y'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % line([-1 1],[1 1]) % line([1 -1],[1 0]) % line([-1 -1],[0 1]) % line([-1 1],[-0.5 -0.5]) % line([-1 1],[-1.5 -1.5]) % line([1 1],[-0.5 -1.5]) % line([-1 -1],[-0.5 -1.5]) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % hold on % sj=plot([-1 1],[1 1],[1 -1],[1 0],[-1 -1],[0 1]); % hold on % set(sj,'Color','r','LineWidth',4); % js=plot([-1 1],[-0.5 -0.5],'b',[-1 1],[-1.5 -1.5],'b',[1 1],... % [-0.5 -1.5],'b',[-1 -1],[-0.5 -1.5],'b'); % hold on % set(js,'Color','b','LineWidth',4); %hold off figure colordef(gcf,'white') echo off clc axis([-2,2,-2,2]) axis on grid xlabel('Input x'); ylabel('Input y'); hold on sj=plot([-1 1],[1 1],[1 -1],[1 0],[-1 -1],[0 1]); hold on js=plot([-1 1],[-0.5 -0.5],'b',[-1 1],[-1.5 -1.5],'b',[1 1],... [-0.5 -1.5],'b',[-1 -1],[-0.5 -1.5],'b'); hold on set(sj,'Color','r','LineWidth',4); set(js,'Color','b','LineWidth',4); hold on SamNum=400; % 训练样本数 rand('state', sum(100*clock)) SamIn=(rand(2,SamNum)-0.5)*4; % 产生随机样本输入 % 根据目标函数获得训练样本输入输出,并绘制样本 SamOut=[]; for i=1:SamNum Sam=SamIn(:,i); x=Sam(1,1); y=Sam(2,1); if((x>-1)&(x<1))==1 if((y>x/2+1/2)&(y<1))==1 plot(x,y,'k+') class=[0 1 0]'; elseif((y<-0.5)&(y>-1.5))==1 plot(x,y,'ks') class=[0 0 1]'; else plot(x,y,'ko') class=[1 0 0]'; end else plot(x,y,'ko') class=[1 0 0]'; end SamOut=[SamOut class]; end HiddenUnitNum=10; % 隐节点数 MaxEpochs=10000; % 最大训练次数 lr=0.1; % 学习率 E0=0.1; % 目标误差 W1=0.2*rand(HiddenUnitNum,InDim)-0.1; % 输入层到隐层的初始权值 B1=0.2*rand(HiddenUnitNum,1)-0.1; % 隐节点初始偏移 W2=0.2*rand(OutDim,HiddenUnitNum)-0.1; % 隐层到输出层的初始权值 B2=0.2*rand(OutDim,1)-0.1; % 输出层初始偏移 W1Ex=[W1 B1]; % 输入层到隐层的初始权值扩展, 10*3 W2Ex=[W2 B2]; % 隐层到输出层的初始权值, 3*11 SamInEx=[SamIn' ones(SamNum,1)]'; % 样本输入扩展, 3*200 ErrHistory=[]; % 用于记录每次权值调整后的训练误差 for i=1:MaxEpochs % 正向传播计算网络输出 HiddenOut=logsig(W1Ex*SamInEx); HiddenOutEx=[HiddenOut' ones(SamNum, 1)]'; NetworkOut=logsig(W2Ex*HiddenOutEx); % 停止学习判断 Error=SamOut-NetworkOut; SSE=sumsqr(Error); fprintf('Times: %7.0f',i); fprintf(' SSE: .4f\n\n',SSE); % 记录每次权值调整后的训练误差 ErrHistory=[ErrHistory SSE]; if SSE<E0, break, end % 计算反向传播误差 Delta2=Error.*NetworkOut.*(1-NetworkOut); Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut); % 计算权值调节量 dW2Ex=Delta2*HiddenOutEx'; dW1Ex=Delta1*SamInEx'; % 权值调节 W1Ex=W1Ex+lr*dW1Ex; W2Ex=W2Ex+lr*dW2Ex; % 分离隐层到输出层的权值,以便后面使用(见 % 计算反向传播误差 之第二行132) W2=W2Ex(:,1:HiddenUnitNum); end W1=W1Ex(:,1:InDim); B1=W1Ex(:,InDim+1); % W2=W2Ex(:,1:HiddenUnitNum); B2=W2Ex(:,1+HiddenUnitNum); % 绘制学习误差曲线 figure hold on grid [xx,Num]=size(ErrHistory); er111=plot(1:Num,ErrHistory,'k-'); set(er111,'Color','b','LineWidth',1.5); % 根据目标函数获得训练样本输入输出,并绘制样本 TestSamNum=10000; % 测试样本数 %rand('state', sum(100*clock)); TestSamIn=(rand(2,TestSamNum)-0.3)*4; % 产生随机样本输入 TestHiddenOut=logsig(W1*TestSamIn+repmat(B1,1,TestSamNum)); TestNetworkOut=logsig(W2*TestHiddenOut+repmat(B2,1,TestSamNum)); [Val,NNClass]=max(TestNetworkOut); TestTargetOut=[]; for i=1:TestSamNum Sam=TestSamIn(:,i); x=Sam(1,1); y=Sam(2,1); if((x>-1)&(x<1))==1 if((y>x/2+1/2)&(y<1))==1 TestTargetOut=[TestTargetOut 2]; elseif((y<-0.5)&(y>-1.5))==1 TestTargetOut=[TestTargetOut 3]; else TestTargetOut=[TestTargetOut 1]; end else TestTargetOut=[TestTargetOut 1]; end end %显示计算结果 NNC1Flag=abs(NNClass-1)<0.1; NNC2Flag=abs(NNClass-2)<0.1; NNC3Flag=abs(NNClass-3)<0.1; TargetC1Flag=abs(TestTargetOut-1)<0.1; TargetC2Flag=abs(TestTargetOut-2)<0.1; TargetC3Flag=abs(TestTargetOut-3)<0.1; Target_C1_num=sum(TargetC1Flag); Target_C2_num=sum(TargetC2Flag); Target_C3_num=sum(TargetC3Flag); Test_C1_num=sum(NNC1Flag); Test_C2_num=sum(NNC2Flag); Test_C3_num=sum(NNC3Flag); Test_C1_C1=1.0*NNC1Flag*TargetC1Flag'; Test_C1_C2=1.0*NNC1Flag*TargetC2Flag'; Test_C1_C3=1.0*NNC1Flag*TargetC3Flag'; Test_C2_C1=1.0*NNC2Flag*TargetC1Flag'; Test_C2_C2=1.0*NNC2Flag*TargetC2Flag'; Test_C2_C3=1.0*NNC2Flag*TargetC3Flag'; Test_C3_C1=1.0*NNC3Flag*TargetC1Flag'; Test_C3_C2=1.0*NNC3Flag*TargetC2Flag'; Test_C3_C3=1.0*NNC3Flag*TargetC3Flag'; Test_Correct=(Test_C1_C1+Test_C2_C2+Test_C3_C3)/TestSamNum; % 输出格式设计 disp('///////////////////////////////////////////////////////////'); fprintf('\n'); disp(' 测试报告'); fprintf('\n'); fprintf('测试样本总数: %7.0f\n\n',TestSamNum); fprintf('第一类样本数: %7.0f\n',Target_C1_num); fprintf('第二类样本数: %7.0f\n',Target_C2_num); fprintf('第三类样本数: %7.0f\n\n',Target_C3_num); disp('= = = = = = = = = = = = = = = = = = = = = = = = = = = '); fprintf('\n'); fprintf('第一类样本分布(C1=%4.0f)\n',Test_C1_num); fprintf(' C11=%4.0f',Test_C1_C1); fprintf(' C12=%4.0f',Test_C1_C2); fprintf(' C13=%4.0f\n\n',Test_C1_C3); fprintf('第二类样本分布(C2=%3.0f)\n',Test_C2_num); fprintf(' C21=%4.0f',Test_C2_C1); fprintf(' C22=%4.0f',Test_C2_C2); fprintf(' C23=%4.0f\n\n',Test_C2_C3); fprintf('第三类样本分布(C3=%3.0f)\n',Test_C3_num); fprintf(' C31=%4.0f',Test_C3_C1); fprintf(' C32=%4.0f',Test_C3_C2); fprintf(' C33=%4.0f\n\n',Test_C3_C3); fprintf('正确率:%6.4f\n\n',Test_Correct); disp('///////////////////////////////////////////////////////////'); fprintf('\n\n');

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值