神经网络——单层感知器
·
单层感知器是感知器中最简单的一种,只能用来解决线性可分的二分类问题。
分类过程:
输入层——隐藏层——输出层
比如在输入层输入N维向量x=[x1,x2,...,xn],隐藏层给每个分量设置一个权值wi,输出一个标量v。对v值进行判断,当
时,输出y=1,反之,输出y=-1,以此对输入数据分类。
一般而言,除了权值w,实际上还会设置一个外部偏置b,
这样,输出y表示为
单层感知器进行模式识别的超平面表示为:
当维数n=2时,输入向量可表示为坐标点(x,y),分类超平面是一条直线
在直线下方的点,输出v>0, y=1;在直线上方的点,输出v<0,y=-1。
matlab神经网络原理与实例精解 陈明 等编著
第4章 单层感知器 P124
对6个线性可分的坐标点分类:
clc,clear
n=0.2; %学习率
P=[-9 1 -12 -4 0 5; %第一行,x轴坐标
15 8 4 5 11 9]; %第二行,y轴坐标 每列为一个样本
d=[0 1 0 0 0 1];%样本的期望分类
P=[ones(1,6);P];
w=[0 0 0]; %初始化[偏置b,权值w1 w2]
max=20; %最大训练次数
i=1;
while 1
v=w*P; %隐含层的输出叠加,同时也是输出层的输入
y=hardlim(v); %harlim函数当矩阵v>0,对应位置返回1,反之返回0
e=d-y; %误差=期望输出-实际输出,返回行向量,列数为样本数
maerror(i)=sum(abs(e)/length(e));%记录误差的平均绝对差,该值越小,说明分类越准确
if maerror(i)<eps %当误差的平均绝对差极小时,跳出循环
disp('误差极小')
break;
end
w=w+n*e*P'; %更新权值向量
i=i+1
if i>max %超过最大训练次数时,同样跳出循环
disp('超过最大训练次数')
break;
end
end
%% 显示
subplot(2,1,1);%显示代分类的点和分类结果
plot([-9 -12 -4 0],[15 4 5 11],'o') %第一类点
hold on
plot([1 5],[8 9],'*') %第二类点
legend('第一类','第二类')
title('6个坐标点的二分类')
x=-13:0.1:6;
y=-w(1)/w(3)-w(2)/w(3)*x; %划分线
plot(x,y)
hold off
subplot(2,1,2); %显示maerror变化
x=1:i;
plot(x,maerror,'o-')
s=sprintf('mae(误差的平均绝对差)的值(迭代次数:%d)',i); %sprintf 字符串的格式化输出
title(s)
结果如下:

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)