单层感知器应用案例——坐标的二分类

1 基本概念

单层感知器是最简单的神经网络。本节将通过坐标点的二类模式分类问题,用手算1和使用工具箱函数2两种方法应用单层感知器。最后将问题稍作修改,使其线性不可分3,验证单层感知器的局限性。(三个工作)

1.1 手算

单层感知器应用案例——坐标的二分类

单层感知器应用案例——坐标的二分类
这是一个线性可分问题,输入向量是2维向量,在2维空间内可用一条直线将两个类别正确的分开,如图4-11所示。
单层感知器应用案例——坐标的二分类

由于输入向量维数为 2,输出向量维数为1,因此, 创建的感知器网络拥有2 个输入节点, 1个输出节点, 网络结构如图 4-12 所示。
单层感知器应用案例——坐标的二分类
网络需要求解的是权值w1,w2和偏置b。
(1) 定义向量
w=[b,w1,w2]Tw=[b,w_1,w_2]^T
定义输入
[1x1y11x2y2......]T\left[\begin{matrix}1 & x_1 & y_1\\1 & x_2 & y_2\\.. & .. & ..\end{matrix}\right]^T
期望输出
d=[0,1,0,0,0,1]Td = [0,1,0,0,0,1]^T

>> 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
单层感知器应用案例——坐标的二分类

其实结果是一样的。