神经网络-感知器(二):Python代码实现

时间:2022-07-23
本文章向大家介绍神经网络-感知器(二):Python代码实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

之前介绍过神经网络中单层感知器的原理,不清楚的小伙伴可点击?神经网络-感知器进行回顾,本次来通过一个简单的小例子进行感知器的代码实现。

1

训练问题

题目:有正样本(3,3)(4,3),和负样本(1,1),根据这三个点训练可用于点分类点感知器模型

思路:样本为两维需要两个输入节点,另将偏置项也作为节点输入,则共需要三个输入节点,因此可知我们需要的感知器是如下结构?

2

Python实现

  • step 1:输入样本点及初始化信息 我们首先初始化一个0-1之间的权重向量,选定学习率为0.15,并预留变量记录迭代次数和输出。
#输入样本点及标签
X = np.array([[1,3,3],[1,4,3],[1,1,1]])
Y = np.array([1,1,-1])
#初始化权值
W = np.array(np.random.random(3))
lr = 0.15
#记录迭代次数和输出
n = 0
O = 0
  • step 2:建立权重更新函数 根据 ωj(k+1) =ωj(k) +λ(yi-y*(k))xij 权重变化公式,我们要先计算出在当前权重下,预测出的结果值,然后计算与实际值的差值再与学习率和x相乘,最后来调节下一次的权重。这里计算权重变化时除以了输入的数据数,这是因为权重是每个点计算出需要的权值改变量的和,如果点过多,可能导致权重改变量过大,因此这里求均值。具体矩阵间计算关系可实际写一下就很好理清。
def update():
    global X,Y,W,lr,n
    n+=1
    O = np.sign(np.dot(X,W.T))
    deltaW = (lr*(Y-O.T).dot(X))/X.shape[0]
    W = W + deltaW
  • step 3:训练模型 训练结束条件可以有三种:a.误差小于阈值;b.两次迭代之间权值变化很小;c.设置最大迭代次数。这里我们设置最大迭代次数为100,并且每次迭代后计算当前输出是否与目标值一致,一致则结束,同时输出迭代次数。
for _ in range(100):
    update()
    O = np.sign(np.dot(X,W.T))
    if(O ==Y.T).all():
        print('Finished')
        print('迭代次数:',n)
        break
  • step 4:画图观察结果 我们在图中标识出正负样本点,并根据训练出的权重来画出分割线。因为

,当把x2当作y,x1当作x,就可以计算出直线的斜率与截距,从而画出直线。

#记录正负样本        
x1 = [3,4]
y1 = [3,3]
x2 = [1]
y2 = [1]

#计算分界线的斜率及截距
k = -W[1]/W[2]
d = -W[0]/W[2]

xdata = np.linspace(0,5)
plt.figure()
plt.plot(xdata,xdata*k+d,'r')
plt.plot(x1,y1,'b*')
plt.plot(x2,y2,'y*')
plt.show()