在人工神经网络领域中,感知器也被指为单层的人工神经网络,以区别于较复杂的多层感知器(Multilayer Perceptron)。 作为一种线性分类器,(单层)感知器可说是最简单的前向人工神经网络形式。尽管结构简单,感知器能够学习并解决相当复杂的问题。 ————百度百科:感知器(神经网络模型)
在人体神经网络中,神经细胞是有着基本处理信号功能的基本单元,单层感知器就是人工神经网络中模拟人体神经细胞的基本单元。
参考资料:AI MOOC
单层感知器是最简单的神经网络,它包含输入层和输出层,信号先经过线性组合器处理然后再经过激活函数,最后输出结果。
输入节点是信号的输入端,感知器可以有很多个信号输入,也就是可以有很多个输入节点。通常会多设置一个输入节点,它的输入值为偏置因子,权重为1,便于矩阵的运算。
输出节点是信号经过感受器处理后输出的结果。
在人体神经细胞结构中,每个树突的信号强度可能会有所不同,在单层感受器中,给每个输入节点的输入的信号添加权重,很好的模拟了人体神经细胞的结构和功能。
在单层感知器中,将各输入节点与各自权重的乘积求和这个算法就是线性组合器。
在单层感知器中,激活函数是一个二值阈值元件,在信号经过线性组合器组合之后,通过这个激活函数判断当前的信号强度是否满足激活的条件,一般来说如果满足则输出1,不满足则输出-1.
学习率(Learning rate)作为监督学习以及深度学习中重要的超参,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值。合适的学习率能够使目标函数在合适的时间内收敛到局部最小值。
不同学习速率对收敛的影响(图片来源::cs231n)
输入节点:3个(横坐标一个,纵坐标一个,偏置因子一个)
输入数据:(1,3,3),(1,3,4),(1,4,3),(1,2,2),(1,1,2),(1,2,1)每组数据中的第一个数据为我们设置为1的偏执因子。对应的标签为(1,1,1,-1,-1,-1)
初始化权值:w0,w1,w2取-1到1的随机数。
学习率:设置为0.11
激活函数:sign(x)=1(x>0),-1(x<0)
import numpy as np#导入Numpy科学计算库
import matplotlib.pyplot as plt#导入matplotlib二维绘图库
X=np.array([[1,3,3],
[1,3,4],
[1,4,3],
[1,2,2],
[1,1,2],
[1,2,1],])#6x3数据矩阵
Y=np.array([[1],[1],[1],[-1],[-1],[-1]])#6x1标签矩阵
W=(np.random.random([3,1])-0.5)*2#权值初始化,取0到1的随机数,将得到的随机数-0.5范围变成-0.5到0.5,再乘以2,最后范围变成我们需要的范围-1到1
print(W)#将生成的随机数打印出来
lr=0.11#设置学习率(learning rate)为0.11
O=0#神经网络的输出(output)初始化为0
def update():#迭代函数
global X,Y,W,lr
O=np.sign(np.dot(X,W))#将输入和其对应的权重进行相乘得到6x1的输出矩阵,矩阵中每行对应输入数据中每一组数据的输入节点与其权重的乘积之和。
W_C=lr*(X.T.dot(Y-O))/int(X.shape[0])#权值的改变量=学习率*(预期标签-实际算出的标签)/数据的组数
#X.shape[0]是X矩中的行数,X.shape[1]是X矩阵中的列数,在输入数据矩阵中的一行为一组输入数据,输入数据矩阵的行数就是数据的组数,因此在这用的是X.shape[0]
w=W+W_C#对权值矩阵进行调整
for i in range(100):
update()
print(W)
print("第",i,"次迭代")
O=np.sign(np.dot(X,W))#计算当前的输出
if(O==Y).all():
print("Finished")#网络的实际输出的标签等于预期的标签,模型收敛,循环结束
print("epoch:",i)#输出迭代次数
break
#画图
x1=[3,3,4]#标签为1的数据组
y1=[3,4,3]
x2=[2,1,2]#标签为-1的数据组
y2=[2,2,1]
k=-W[1]/W[2]#斜率
d=-W[0]/W[2]#截距
print('k=',k)
print('d=',d)
xdata=(0,5)#设置显示出来的坐标轴的x轴显示范围为0到5
plt.figure()#初始化图形
plt.plot(xdata,xdata*k+d,'r')#画出直线,颜色为红色
plt.scatter(x1,y1,c='b')#画出标签为1的点,颜色为蓝色
plt.scatter(x2,y2,c='y')#画出标签为-1的点,颜色为黄色
plt.show()