神经网络——单层感知器

 单层感知器是感知器中最简单的一种,只能用来解决线性可分的二分类问题。

分类过程:

输入层——隐藏层——输出层

比如在输入层输入N维向量x=[x1,x2,...,xn],隐藏层给每个分量设置一个权值wi,输出一个标量vv=\sum_{i=1}^{n}x_{i}w_{i}。对v值进行判断,当v\geq 0时,输出y=1,反之,输出y=-1,以此对输入数据分类。

一般而言,除了权值w,实际上还会设置一个外部偏置b,

这样,输出y表示为y= sgn(\sum_{i=1}^{n}w_{i}x_{i}+b)

单层感知器进行模式识别的超平面表示为:

\sum_{i=1}^{n}w_{i}x_{i}+b=0

当维数n=2时,输入向量可表示为坐标点(x,y),分类超平面是一条直线

w_{1}x+w_{2}y+b=0

在直线下方的点,输出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)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)

结果如下:

神经网络——单层感知器_第1张图片

你可能感兴趣的:(matlab,机器学习,人工智能,matlab,神经网络)