单层感知器应用案例——坐标的二分类
1 基本概念
单层感知器是最简单的神经网络。本节将通过坐标点的二类模式分类问题,用手算1和使用工具箱函数2两种方法应用单层感知器。最后将问题稍作修改,使其线性不可分3,验证单层感知器的局限性。(三个工作)
1.1 手算
这是一个线性可分问题,输入向量是2维向量,在2维空间内可用一条直线将两个类别正确的分开,如图4-11所示。
由于输入向量维数为 2,输出向量维数为1,因此, 创建的感知器网络拥有2 个输入节点, 1个输出节点, 网络结构如图 4-12 所示。
网络需要求解的是权值w1,w2和偏置b。
(1) 定义向量
定义输入
期望输出
>> n = 0.2; %学习率
>> w = [0,0,0]; %存放权值和偏置w = [b,w1,w2]
>> P = [-9, -1, -12, -4, 0, 5;...
15,-8,4,5,11,9];%坐标
>> d=[0,1,0,0,0,1]; %期望输出
>>
>> P = [ones(1,6);P]; %坐标矩阵
>> MAX=20; % 最大迭代次数为20次
>> %%训练
>> i = 0
>> while 1
v = w*P;
y = hardlim(v); %实际输出
%更新
e = (d-y) %误差
ee(i+1) = mae(e); %ee数组的i+1位为误差的平均绝对差
if(ee(i+1)<0.001) %判断误差很小时
disp('we have got it:');%命令行输出
disp(w);
break;
end
%更新权值和偏置
w = w+n*(d-y)*P';
if(i>=MAX) %达到最大迭代次数,退出
disp('Max times loop');
disp(w);
disp(ee(i+1));
break;
end
i = i+1;
end
e =
-1 0 -1 -1 -1 0
e =
0 0 0 0 0 1
e =
0 0 0 0 0 1
e =
0 0 0 0 0 0
we have got it:
-0.4000 7.0000 -3.4000
%% 显示
figure;
subplot(2,1,1); % 显示待分类的点和分类结果
plot([-9 , -12 -4 0],[15, 4 5 11],'o');
hold on;
plot([1,5],[-8,9],'*');
axis([-13,6,-10,16]);
legend('第一类','第二类');
title('6个坐标点的二分类');
x=-13:.2:6;
y=x*(-w(2)/w(3))-w(1)/w(3);
plot(x,y);
hold off;
subplot(2,1,2); % 显示mae值的变化
x=0:i;
plot(x,ee,'o-');
s=sprintf('mae的值(迭代次数:%d)', i+1);
title(s);
最后我们得到答案,w1=-0.4,w2=7 b = -3.4
包括绘图的输出结果如下:
但对于线性不可分的问题,使用这个代码,情况则会变成这样:
如果我们使用神经网络工具箱进行训练:
% perception_newp.m
% 清理
clear,clc
close all
% 创建感知器
net=newp([-20,20;-20,20],1);
%定义输入训练向量
P=[ -9, 1, -12, -4, 0, 5;...
15, -8, 4, 5, 11, 9];
% 期望输出
T=[0,1,0,0,0,1]
% 训练
net=train(net,P,T);
% 输入训练数据仿真验证
Y=sim(net,P)
>> iw = net.iw;
>> b = net.b;
>> w = [b{1},iw{1}]
w =
0 14 -6
最后我们得到答案,w1=14,w2=-6 b = 0
其实结果是一样的。