【城北徐公之机器学习】感知机模型
一、什么是感知机?
感知机最早由计算科学家Rosenblatt在1958年提出,他是一种单层(注意,输入层并不计算在内)神经网络。如图为一个二元输入的感知机模型。
其中x1,x2为输入,b为偏置,激活函数被称为符号函数(sign function),我们将激活函数的输出记为,其函数表达式及图像如下所示。
二、感知机可以用来干什么?
感知机可以用来处理线性可分类问题,线性可不可分简单来说,就是可不可以用一条直线把图上两类点划分开。如第二张图所示,无论怎么画直线都无法将两类点分区开。
线性可分
线性不可分
对于线性不可分问题一般用多层神经网络,SVM来处理。
三、感知机如何实现线性分类?
我们举一个最最最简单的分类问题,逻辑运算(这里我们用“与”运算)并且结合matlab代码来说明感知机如何实现线性分类。
X1 |
X2 |
y |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
也就是说,我们要在平面上找到这样一条直线,把点(1,1)与其它点划分开,而这条直线的方程为(decision boundary),如果把符号激活函数向右平移1各单位,那么这条直线方程则为
。
转化为最优化问题,那如何找这么一个函数来描述优化程度?因为激活函数不平滑,无法用误差的形式来描述。
这里我们提出一种点到直线距离的描述方法J=,对误分类点而言,J>0;
我们对数据集中的训练点逐一进行判别,训练权重,直至无误分类点。
权重训练方法采用的是梯度下降法。
matlab代码:
close all;
clear;
w=[1 0.5];b=0;%随机设置初始权值与阈值
%p,t为给定的训练样本,p为输入,t为对应的输出
%And计算网络迭代训练五次
p=[0 0;0 1;1 0;1 1];
t=[-1;-1;-1;1];
p1=[p;p;p;p;p];
t1=[t;t;t;t;t];
%训练过程传递函数为阶跃函数
for i=1:size(p1,1)
n=0.5;%学习率
a=unitstep(p1(i,1:2)*w'+b);
if t1(i)*(p1(i,1:2)*w'+b)<0
w=w+n*p1(i,1:2)*t1(i);
b=b+n*t1(i);
figure(1)
plot(i,w(1),'*');
hold on;
figure(2)
plot(i,w(2),'^');
hold on;
figure(3)
x1=0:0.1:1;
x2=(-w(1)/w(2))*x1-b/w(2);
plot(x1,x2)
plot([0 0 1 1],[0 1 0 1],'^');
axis([0 1 0 1])
hold on;
end
end
%网络输出
a=unitstep(p(1:4,1:2)*w'+b)