使用单层感知器对坐标点进行二分类

来源:互联网 发布:淘宝网商城广场舞服装 编辑:程序博客网 时间:2024/06/04 18:22

单层感知器是最简单的神经网络。在本文用手算和使用工具箱两种方法应用单层感知器,实现对坐标点进行二分类。

一、问题描述

给出平面中的若干点及每个点所属的类型,要求正确地实现分类。在问题中我们给出的是6个点的二分类问题,并且这6个点是线性可分的。

待分类点的分布
坐标点及期望输出
这是一个线性可分问题,输入向量是2维向量,在二维向量中可用一条直线将两个类别正确的分开。对其进行分类的最终结果为,如下图所示:
分类后的结果
由于输入向量维数为2,输出向量维数为1,因此,创建的感知器网络拥有2个输入节点,1个输出节点,因此设计网络的结构图为:
使用的单层感知器结构
在算法中需要求解的是权值ω1、ω2和偏置b。

二、手算

在计算权值ω1、ω2和偏置b的时候是一直利用循环来实现,利用ω=ω+(d-y)P’来进行求解,下面是MATLAB源代码:

%% 坐标点的二类模式分类问题n=0.2; %学习率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];w = [0,0,0];MAX = 20;%% 训练i=0;while 1    v = w*P;    y = hardlim(v);    %更新    e = (d-y);    ee(i+1) = mae(e);    if (ee(i+1)<0.001)        disp('we have got it:');        disp(w);        break;    end    % 更新权值和偏置    w = w+n*(d-y)*P';    i = i+1;    if (i>=MAX)        disp('MAX times loop');        disp(w);        disp(ee(i+1));        break;    endend%% 显示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:0.2:6;y = x*(-w(2)/w(3)-w(1)/w(3));plot(x,y);hold off;subplot(2,1,2);x = 0:i;plot(x,ee,'o-');s = sprintf('mae的值(迭代次数:%d)',i+1);title(s);

实验结果如下:
分类后的实验结果图
从图中可以看出在迭代了4次之后,达到了预定的范围,并且把两类点进行了分类,计算出的直线为7x-3.4y-0.4=0.

三、使用MATLAB工具箱函数

使用函数newp创建感知器,用train函数对感知器进行训练,最后用sim函数进行仿真验证。感知器主要有2个输入节点、1个输出节点构成。MATLAB代码如下:

clear,clcclose 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}];disp(w);%% 显示figure;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:0.2:6;y = x*(-w(2)/w(3)-w(1)/w(3));plot(x,y);hold off;

实验结果如下图:
分类结果
计算出的直线为7x-3y=0.

原创粉丝点击