老饼讲解-神经网络
自实现-感知机
感知机
二分类感知机原理
作者 : 老饼 日期 : 2022-06-21 15:46:00 更新 : 2022-06-29 01:28:14
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com


感知机(perceptron)由Rosenblatt在1957提出,只解决二分类问题,

它的输出为-1或1,是神经网络与支持向量基的基础。

本文讲述感知机的原理、算法流程及代码实现,是matlab中单层感知机神经网络的基础。


本文主要参考于 李航-《统计学习方法》



一、单层感知机的结构


  (1)模型数学表达式  


感知机的模型数学表达式为:



其中,





  (2) 感知机的意义  



在输入为二维的时候,
单层感知机就相当于找出一条直线(在多维的时候,就是平面或超平面),
将平面一分为二,一边为正样本,另一边为负样本

 


 




二、感知机的训练


  (一) 感知机的训练目标  


感知机的误差评估函数为误分类的占比

 

其中,,即感知机对第i个样本的预测值。

感知机的训练目标就是找出一组w,b,使E最小化。



  (二) 损失函数  


感知机的训练可以使用梯度下降法,
但由于误差评估函数,不方便求导,
所以先构造一个与误差评估函数相关的损失函数,
然后用损失函数的梯度来引导w,b的调整。


可以用以下函数作为损失函数,来引导w,b的迭代方向。




上式的意义如下:

(1) 当网络对第i个样本预测正确时:
为正,为 1,则 为正
为负, 为-1,则 为正

(2) 当网络对第i个样本预测错误时:
为正,为 -1,则 为负
为负,为1,则 为负
总的来说,
预测正确时,为正,
预测错误时,为负,
即,网络越正确,L(w,b)越小,网络越错误,L(w,b)越大。
则我们要令L更小,只要往w和b的负梯度方向调整即可。


  (三) wb的梯度  


可算得损失函数L中 w 和 b 的梯度如下:
(1) w的梯度


(2) b的梯度


  (四) 单样本时w,b的梯度  


感知机一般用单样本训练,
由上可算得对于单个样本训练时,w,b的梯度为:





  三、算法流程  


感知机采用逐样本训练方法,

具体训练流程如下:



1、初始化

将w和b的元素全部初始化为0。


2、逐样本训练

逐个样本训练 w,b:
------如果训练样本的预测值与真实值不一致,则往负梯度方向更新w,b( 其中,lr为学习率):
----------  
----------  


3、检测是否终止训练

如果总体预测误差达到目标,或达到最大训练步数,则终止训练,否则重复2

                                        误差的评估: 

                  


4、输出结果

输出w,b和网络最终的预测误差


已被证明,在样本点可分的情况下,算法经过有限次迭代,感知机肯定能将样本完全分开。

证明可参考 李航-《统计学习方法》2.3.2节。




  四、实现代码  


下面的一个感知机的实现Demo


  代  码  



matlab2014b中已跑通

% 本代码展示一个感知机模型的训练DEMO
% ----------训练数据-------------------
X = [0 0 0.2 1 1 0.8; 0 1 0.5 0 1 0.3];
y = [-1 -1 -1 1 1 1 ];

%----------参数设置与常量计算-----------------
[in,sn] = size(X);    % 输入个数与样本个数
goal    = 0;          % 训练目标
lr      = 0.1;        % 学习率
epochs  = 100;        % 最大训练步数

% --------初始化权重---------------
w = zeros(1,in); % 初始化权重
b = 0;           % 初始化阈值

% ----------感知机训练---------------------
for i = 1:epochs
    % 逐样本训练
    for j = 1:sn
        cur_x = X(:,j);                 % 当前训练样本
        cur_y = y(:,j);
        py =  2*((w*cur_x+b)>=0)-1;     % 当前训练样本的预测值
        if(py~=cur_y)
            w = w + lr*cur_y*cur_x';
            b = b + lr * cur_y;
        end
    end
    % 如果误差达到目标,则退出训练
    e   = sum(( 2*((w*X+b)>=0)-1 )~=y)/sn;      % 计算误差    
    if e<=goal
       break; 
    end
end

% -------------绘制结果----------------------
x_line = [min(X(1,:)),max(X(1,:))];
y_line =(-w(1)*x_line-b)/w(2);
plot(x_line,y_line)
hold on
plot(X(1,y==1),X(2,y==1),'bo')
hold on
plot(X(1,y==-1),X(2,y==-1),'k*')
hold on
axis([min(X(1,:))-1 max(X(1,:))+1 min(X(2,:))-1 max(X(2,:))+1]) 





  运行结果  



在结果中可以看到,感知机模型把两类样本点完美地分开。









 End 







联系小饼