目录
老饼讲解:一步一步上手学习

【模型】一篇入门-PN-感知机神经网络

作者 : 老饼 发表日期 : 2025-12-16 23:48:42 更新日期 : 2026-05-10 20:17:35
老饼讲解-简单易懂,干货满满,爽过嗦螺!


感知机神经网络(Perceptron Net)是一种很古朴的神经网络模型,用于对样本进行二分类,它可以说是神经网络的起源模型,其实现在很少会有人去使用糨了,更多的是一种历史意义价值,由于一些教程总是不断提及它,所以作为一种常识,我们也可以来考古考古,看看感知机到底是一个什么样的模型。

一、感知机-神经网络

1.1. 感知机-是什么

感知机(perceptron)是一种较早的神经网络,它是一个线性模型,它主要用于做二分类, 在输入为二维的时候,感知机就相当于找出一条直线,将平面一分为二,一边为正样本,另一边为负样本 :

 感知机模型的几何意义

1.2. 感知机-模型表达式

我们先来具体地看一下感知机的模型表达式,如下:

   

 其中:     

                

从模型表达式可以看到,y只会输出1或-1,当y=1时代表样本的预测结果为正样本,y=-1时则为负样本。

二、感知机-损失函数

好了,下面我们再来看看感知机的损失函数,事实上,感知机的损失函数不是一下子定义出来的,它先给出了目标函数,再通过损失函数来曲线救国,完成目标函数的目的。

2.1. 感知机-原始目标函数

我们要先来看看感知机的原始目标函数。

感知机的原始目标是希望错误样本越少越好,也就是最小化以下误差E:

  

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

原始目标函数的意义是很好理解的,就是最小化样本的平均错误个数,但是目标函数不能求导,优化起来不方法,所以就又整出了一个可以求导的损失函数。

2.2. 感知机-损失函数

感知机的损失函数为:

 

直接看这个损失函数可能有些难理解,事实上要将它拆出来分情况讨论,才明白它的意思。

好了,下面我们就一起来看看感知机损失函数的意义吧。

1. 当网络对第i个样本预测正确时:

     为正,为 1,则 为正 

     为负, 为-1,则 为正

2. 当网络对第i个样本预测错误时:

     为正,为 -1,则 为负

     为负,为1,则 为负 

综合上面两种情况,就可以得到:

     预测正确时,为正

     预测错误时,为负

可知,网络越正确,L(w,b)越小,网络越错误,L(w,b)越大。因此,只要令L更小,那么感知的预测结果就会更准确,也就达到了优化原始目标函数的效果。

三、感知机的训练算法流程 

感知机一般用单样本训练,即逐个样本训练w、b,如果当前训练样本的预测值与真实值不一致,就往负梯度方向更新w,b。感知机第i个样本的损失函数对 w 和 b 的梯度如下:

     

感知机的具体训练流程如下:

1、初始化

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

2、逐样本训练

     逐个样本训练 w,b,如果训练样本的预测值与真实值不一致,

     则往负梯度方向更新w,b( 其中,lr为学习率):  

              

              

3、检测是否终止训练 

     如果达到训练终止条件,则终止训练,否则重复2 

     训练终止条件如下:

      (1) 总体预测误差达到目标

          误差的评估公式为:

         

      (2) 达到最大训练步数

4、输出结果

     训练完后,输出如下结果

     w:感知机的权重

     b:感知机的阈值

     E:预测误差

已被证明,在样本点可分的情况下,算法经过有限次迭代,感知机肯定能将样本完全分开,证明可参考 李航-《统计学习方法》2.3.2节。

四、感知机神经网络-代码实现

在matlab中使用newp来构建一个感知机模型,下面展示一个实现例子,代码如下:

% 本代码用于展示如何用matlab构建一个感知机神经网络
% 本代码来自《老饼讲解-神经网络》www.bbblearn.com ,matlab版本:2018a
% 训练数据
% ----------训练数据-------------------
X = [0 0 0.2 1 1 0.8; 0 1 0.5 0 1 0.3];
y = [0 0 0 1 1 1 ];

%----使用工具箱训练一个感知机神经网络---------
net = newp(X,y);              % 建立感知机神经网络
net = train(net,X,y);         % 训练感知机神经网络
w   = net.iw{1};              % 感知机的权重
b   = net.b{1};               % 感知机的阈值
py  = sim(net,X);             % 使用训练好的感知机进行预测

%-------------打印权重、阈值和预测结果--------
disp('感知机权重')
w
disp('感知机阈值')
b
disp('感知机预测结果')
py
% -------------绘制结果----------------------
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==0),X(2,y==0),'k*')
hold on
axis([min(X(1,:))-1 max(X(1,:))+1 min(X(2,:))-1 max(X(2,:))+1])

运行结果如下 :

一、训练样本与训练好的感知机(分割线):

感知机的分类效果

从结果中可以看到,感知机所代表的分割线很已好地把两类样本进行区分。

二、 训练好的感知机的权重、阈值和预测结果:    

感知机的权重和阈值

由于感知机神经网络模型的表达式为:   , 代入上述训练好的权重阈值,则得到最终终的模型为:

使用时用上式预测就可以啦~

总结

感知机神经网络用于实现样本的二分类,训练时则通过逐样本调整梯度来使模型更加准确,它是一种很古老的模型,现在没什么人用了,它的历史意义大于实际意义,大概地知道一下就差不多了。



图标 评论
添加评论