人工神经网络(三)单层感知器代码实现

来源:互联网 发布:不在乎大国崛起 知乎 编辑:程序博客网 时间:2024/05/16 08:50

上篇文章,我们介绍了什么是单层感知器,这节课,我们来看看如果用代码实现一个单层感知器

实验问题:

假设平面坐标系上有三个点(3,3),(4,3)这两个坐标点的标签为 1 ,(1,1) 这个坐标的标签为-1 ,构建神经网络来分类

思路:

二维数据,需要两个数据点,将神经元偏置设置成另一个输入点,一共需要三个输入点
输入数据:(1,3,3),(1,4,3),(1,1,1)
数据对应标签为(1,1,-1)
初始化权值为w0,w1,w2 为 -1 到 1 的随机数
学习率为0.11
激活函数:sign

最终我们确定下来的是w0,w1,w2
那么分界线的表达式为: w0+w1*x1+w2*x2=0
因为x2为y轴上的值,那么最终的表达式为:
y=(-w1/w2)*x - -w0/w2

权向量和输入归纳为矩阵表达:

1

2

权值调整:

权值套用规则
lr*(Y-O.T).dot(X)/int(X.shape[0])

(Y-O.T):是实际输出与期望输出的误差
这样我们就可以去套用权值校验公式了

具体代码为:

#单层感知器import numpy as npimport matplotlib.pyplot as plt#输入数据X = np.array([[1,3,3],              [1,4,3],              [1,1,1]])#标签Y = np.array([1,1,-1])#权值初始化一行三列,取值范围-1到1W = (np.random.random(3)-0.5)*2print("W is :",W)#学习率设置lr = 0.11#计算迭代次数n = 0#神经网络输出O=0def update():    global X,Y,W,lr,n,O    n += 1    O = np.sign(np.dot(X,W.T))    W_C = lr*(Y-O.T).dot(X)/int(X.shape[0]) #权值需要改变的值    W = W+W_C #修正权值for _ in range(100):    update() #更新权值    print("W:",W) #打印权值    print("n",n) #打印迭代次数    O = np.sign(np.dot(X,W.T)) #计算当前输出    if(O==Y.T).all(): #如果实际输出等领域期望输出,模型收敛,循环结束        print("Finished")        print("epoch:",n)        break#整样本x1=[3,4]y1=[3,3]#负样本x2=[1]y2=[1]#计算分界线的斜率及截距k=-W[1]/W[2]d=-W[0]/W[2]print("k:",k)print("d:",d)xdata = np.linspace(0,5)plt.figure();plt.plot(xdata,xdata*k+d,"r")plt.plot(x1,y1,"bo")plt.plot(x2,y2,"yo")plt.show()

结果:

这里写图片描述

后台日志为:

这里写图片描述

阅读全文
0 0