使⽤单层感知器对坐标点进⾏⼆分类
单层感知器是最简单的神经⽹络。在本⽂⽤⼿算和使⽤⼯具箱两种⽅法应⽤单层感知器,实现对坐标点进⾏⼆分类。
⼀、问题描述
给出平⾯中的若⼲点及每个点所属的类型,要求正确地实现分类。在问题中我们给出的是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;
while1
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;
end
end
%% 显⽰
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]);
用subplot函数
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,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}];
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.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。