如果对Rosenblatt感知器不了解,可以先查看下相关定义,然后对照下面的代码来理解。
代码中详细解释了各步骤的含义,有些涉及到了数学公式的解释。
这篇文章是以理解Rosenblatt感知器的原理为主,所以只实现了单层感知器,比较复杂的
多层的感知器会在后面写到。
下面是详细代码及说明:
''' 算法:Rosenblatt感知器=====>单层感知器 特性:提供快速的计算,能够实现逻辑计算中的NOT、OR、AND等简单计算
本质:在坐标轴轴里面存在一条直线(面)可以把数据分成两类 ''' ''' 变量约定:大写表示矩阵或数组,小写表示数字 X:表示数组或者矩阵 x:表示对应数组或矩阵的某个值 ''' ''' 关于学习效率(也叫步长:控制着第n次迭代中作用于权值向量的调节)(下面的参数a): 学习效率过大:收敛速度提高,稳定性降低,即出结果快,但是结果准确性较差 学习效率过小:稳定性提高,收敛速度降低,即出结果慢,准确性高,耗费资源 对于学习效率的确定,有专门的算法,这里不做研究。仅仅按照大多数情况下的选择:折中值 ''' import numpy as np a=0.5 ##学习率 0<a<1 X=np.array([[1,1],[1,0],[0,0],[0,1]]) ##输入 D=np.array([1,1,0,1]) ##期望输出结果 W=np.array([0,0]) ##权重向量 ##硬限幅函数(即标准,这个比较简单:输入v大于0,返回1.小于等于0返回-1) ''' 最后的权重为W([1,1]),则:x+y=0 ==>y=-x 即:分类线方程为:y=-x() ''' def sgn(v): if v>0: return 1 else: return -1 ##激活函数(输出函数) ''' 这里是两个向量相乘,对应的数学公式: a(m,n)*b(p,q)=m*p+n*q 在下面的函数中,当循环中xn=1时(此时W=([1,1])): np.dot(W.T,x)=(1,1)*(1,1)=1*1+1*1=2>0 ==>sgn 返回1 ''' def output(W,x): return sgn(np.dot(W.T,x))##dot表示两个矩阵相乘 ##权重计算函数 ''' 对应数学公式: w(n+1)=w(n)+a(d(n)-y(n))*x(n) 对应下列变量的解释: w(n+1) <= neww 的返回值 w(n) <=oldw(旧的权重向量) a <= a(学习率,范围:0<a<1) d(n) <= d(期望输出值) y(n) <= output的返回值(实际输出值) x(n) <= x(输入值) ''' def neww(oldW,d,x,a): return oldW+a*(d-output(oldW,x))*x ##修正权值 ''' 此循环的原理: 权值修正原理(单样本)==>神经网络每次读入一个样本,进行修正, 样本读取完毕,修正过程结束 ''' i=0 for xn in X: W=neww(W,D[i],xn,a) i+=1 print("最后的权值:",W.T) ##输出结果 print("开始验证结果...") for xn in X: print("D%s and W%s =>%d"%(xn,W.T,output(W,xn))) ##测试准确性: ''' 由上面的说明可知:分类线方程为y=-x,从坐标轴上可以看出: (2,3)属于+1分类,(-2,-1)属于-1分类 ''' print("开始测试...") test=np.array([2,3]) print("D%s and W%s =>%d"%(test,W.T,output(W,test))) test=np.array([-2,-1]) print("D%s and W%s =>%d"%(test,W.T,output(W,test)))
输出结果:
>>> 最后的权值: [ 1. 1.] 开始验证结果... D[1 1] and W[ 1. 1.] =>1 D[1 0] and W[ 1. 1.] =>1 D[0 0] and W[ 1. 1.] =>-1 D[0 1] and W[ 1. 1.] =>1 开始测试... D[2 3] and W[ 1. 1.] =>1 D[-2 -1] and W[ 1. 1.] =>-1 >>>