Python实现单层感知器:原理、训练与AND逻辑门代码详解

Miles
Miles
发布时间:2026-10-12| 4人浏览过
原创

本文深入解析感知器这一最简单的单层神经网络模型,阐述其通过权重w和偏置b拟合线性函数的原理。重点讲解基于阶跃激活函数的训练算法,包括权重初始化、输出计算及误差更新步骤。通过Python代码完整实现AND逻辑门,展示感知器在可线性分离问题中的应用,并指出其无法处理异或(XOR)等非线性问题的局限性。

承接上一篇关于感知器用法的转载内容,本文旨在对感知器进行简要总结,并通过Python代码实现一个基础的感知器模型,以此加深对其工作原理的理解。

感知器是结构最简单的神经网络形式,仅包含单一层级。它是一种模拟生物神经元行为机制的计算模型。感知器的基本结构模型如下所示:

假设输入为一个n维向量,其中w代表权重参数,b代表偏置项。权重w与每个输入维度一一对应,而偏置b则需通过训练数据学习得出。

在感知器中,激活函数的选择具有多样性。例如,我们可以采用如下所示的阶跃函数f作为激活函数:

最终输出由激活函数处理后的结果决定,具体公式如下:

理论上,感知器能够拟合任意线性函数,因此适用于解决所有线性分类或线性回归问题。然而,感知器无法实现异或(XOR)运算,这并非感知器独有缺陷,所有线性分类器均无法解决异或操作。

异或操作的逻辑定义如下:

其二维数据分布情况如图所示:

观察上图可知,无法找到一条直线将类别0和类别1完全分开。相比之下,对于AND(与)操作,感知器能够有效实现,因为存在一条直线可以将两类数据分隔开。

针对AND操作的具体表现如下:

对应的二维数据分布图如下:

接下来介绍感知器的训练过程。

训练开始时,将权重w和偏置b随机初始化为极小的数值,随后在训练过程中不断迭代更新这两个参数的值。

具体训练步骤如下: 1. 将权重初始化为0或一个很小的随机数; 2. 针对每一个训练样本x(i),执行以下操作:

计算当前样本的输出值y^。

根据误差更新权重参数。

其中表示学习率或相关系数,用于控制更新步长。

下面使用Python代码实现感知器对AND逻辑门的处理,具体实现代码如下:

# -*- coding: utf-8 -*- 
# python 3.4 
import numpy as np 
from random import choice 
from sklearn import cross_validation 
from sklearn.linear_model import LogisticRegression 
''''' 
1.将权重初始化为 0 或一个很小的随机数 
2.对于每个训练样本 x(i) 执行下列步骤: 
 计算输出值 y^. 
 更新权重 
''' 
def load_data(): 
 input_data=[[1,1], [0,0], [1,0], [0,1]] 
 labels=[1,0,0,0] 
 return input_data,labels 
 
  
def train_pre(input_data,y,iteration,rate): 
 #=========================== 
 ''''' 
 参数: 
 input_data:输入数据 
 y:标签列表 
 iteration:训练轮数 
 rate:学习率 
  
 ''' 
 #============================ 
 unit_step = lambda x: 0 if x < 0 else 1 
 w=np.random.rand(len(input_data[0]))#随机生成[0,1)之间,作为初始化w 
 bias=0.0#偏置 
  
  
 for i in range(iteration): 
  samples= zip(input_data,y) 
  for (input_i,label) in samples:#对每一组样本 
   #计算f(w*xi+b),此时x有两个 
   result=input_i*w+bias 
   result=float(sum(result)) 
   y_pred=float(unit_step(result))#计算输出值 y^ 
   w=w+rate*(label-y_pred)*np.array(input_i)#更新权重 
 
   bias=rate*(label-y_pred)#更新bias 
 return w,bias   
 
  
def predict(input_i,w,b): 
 unit_step = lambda x: 0 if x < 0 else 1#定义激活函数 
 result=result=result=input_i*w+b 
 result=sum(result) 
 y_pred=float(unit_step(result)) 
 print(y_pred) 
  
if __name__=='__main__': 
 input_data,y=load_data() 
 w,b=train_pre(input_data,y,20,0.01) 
 predict([1,1],w,b) 

以上内容即为本文的全部讲解,希望能为读者的学习提供有益帮助,同时也欢迎大家继续支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。