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

5 篇文章 0 订阅
3 篇文章 0 订阅

1 基本概念

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

1.1 手算

-w424

-w789
这是一个线性可分问题,输入向量是2维向量,在2维空间内可用一条直线将两个类别正确的分开,如图4-11所示。
-w461

由于输入向量维数为 2,输出向量维数为1,因此, 创建的感知器网络拥有2 个输入节点, 1个输出节点, 网络结构如图 4-12 所示。
-w399
网络需要求解的是权值w1,w2和偏置b。
(1) 定义向量
w = [ b , w 1 , w 2 ] T w=[b,w_1,w_2]^T w=[b,w1,w2]T
定义输入
[ 1 x 1 y 1 1 x 2 y 2 . . . . . . ] T \left[\begin{matrix}1 & x_1 & y_1\\1 & x_2 & y_2\\.. & .. & ..\end{matrix}\right]^T 11..x1x2..y1y2..T
期望输出
d = [ 0 , 1 , 0 , 0 , 0 , 1 ] T d = [0,1,0,0,0,1]^T d=[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
包括绘图的输出结果如下:
-w487

但对于线性不可分的问题,使用这个代码,情况则会变成这样:
-w482

-w477

如果我们使用神经网络工具箱进行训练:

% 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
-w452

其实结果是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值