基于NumPy从零实现Rosenblatt感知器

阿澈
阿澈
发布时间:2026-10-13 | 2人浏览过
原创

本文介绍如何仅利用Python标准库NumPy从零构建一个基础的Rosenblatt感知器。通过线性神经元模型与偏置结合,利用梯度下降法最小化误差平方和目标函数,实现对二维线性可分数据的分类。代码展示了权重迭代更新过程及可视化结果,帮助深入理解神经网络底层原理。

尽管Python拥有成熟的神经网络第三方库,但为了深入理解其内部机制,本文基于NumPy库手动编写了一个简易的神经网络程序。该程序核心基于Rosenblatt感知器,其模型建立在线性神经元之上。具体而言,神经元中的求和节点负责计算突触输入的线性组合,并引入外部偏置进行调节,从而对多个输入信号进行综合处理。为了直观展示分类效果,本文选取了二维数据作为实验对象。

训练过程采用目标函数为误差平方和的策略。由于该目标函数属于二次函数且仅存在一个全局极小值,因此可以使用梯度下降法来高效寻找目标函数的最小值,从而优化模型参数。

具体实现代码如下:

import numpy as np 
import pylab as pl 
b=1    #偏置 
a=0.3   #学习率 
x=np.array([[b,1,3],[b,2,3],[b,1,8],[b,2,15],[b,3,7],[b,4,29],[b,4,8],[b,4,20]]) #训练数据 
d=np.array([1,1,-1,-1,1,-1,1,-1])          #训练数据类别 
w=np.array([b,0,0])            #初始w 
def sgn(v):         
 if v>=0: 
  return 1 
 else: 
  return -1 
def comy(myw,myx): 
 return sgn(np.dot(myw.T,myx)) 
def neww(oldw,myd,myx,a): 
 return oldw+a*(myd-comy(oldw,myx))*myx 
 
for ii in range(5):        #迭代次数 
 i=0 
 for xn in x: 
  w=neww(w,d[i],xn,a) 
  i+=1 
 print w 
 
myx=x[:,1]         #绘制训练数据 
myy=x[:,2] 
pl.subplot(111) 
x_max=np.max(myx)+15 
x_min=np.min(myx)-5 
y_max=np.max(myy)+50 
y_min=np.min(myy)-5 
pl.xlabel(u"x") 
pl.xlim(x_min,x_max) 
pl.ylabel(u"y") 
pl.ylim(y_min,y_max) 
for i in range(0,len(d)): 
 if d[i]==1: 
  pl.plot(myx[i],myy[i],'r*') 
 else: 
  pl.plot(myx[i],myy[i],'ro') 
#绘制测试点 
test=np.array([b,9,19]) 
if comy(w,test)>0: 
 pl.plot(test[1],test[2],'b*') 
else: 
 pl.plot(test[1],test[2],'bo') 
test=np.array([b,9,64]) 
if comy(w,test)>0: 
 pl.plot(test[1],test[2],'b*') 
else: 
 pl.plot(test[1],test[2],'bo') 
test=np.array([b,9,16]) 
if comy(w,test)>0: 
 pl.plot(test[1],test[2],'b*') 
else: 
 pl.plot(test[1],test[2],'bo') 
test=np.array([b,9,60]) 
if comy(w,test)>0: 
 pl.plot(test[1],test[2],'b*') 
else: 
 pl.plot(test[1],test[2],'bo') 
#绘制分类线 
testx=np.array(range(0,20)) 
testy=testx*2+1.68 
pl.plot(testx,testy,'g--') 
pl.show()  
for xn in x: 
 print "%d %d => %d" %(xn[1],xn[2],comy(w,xn)) 

在可视化结果中,红色标记代表训练数据,蓝色标记代表测试数据;其中圆点表示类别-1,星号表示类别1。从图中可以看出,针对线性可分的数据集,Rosenblatt感知器展现出了良好的分类性能。

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

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表