Python实现单层感知器:原理、训练与AND逻辑门代码详解
本文深入解析感知器这一最简单的单层神经网络模型,阐述其通过权重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)
以上内容即为本文的全部讲解,希望能为读者的学习提供有益帮助,同时也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













