首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >神经网络-感知器(二):Python代码实现

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

作者头像
三猫
发布2020-08-18 14:54:43
发布2020-08-18 14:54:43
1.3K0
举报

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

1

训练问题

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

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

2

Python实现

  • step 1:输入样本点及初始化信息 我们首先初始化一个0-1之间的权重向量,选定学习率为0.15,并预留变量记录迭代次数和输出。
代码语言:javascript
复制
#输入样本点及标签
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相乘,最后来调节下一次的权重。这里计算权重变化时除以了输入的数据数,这是因为权重是每个点计算出需要的权值改变量的和,如果点过多,可能导致权重改变量过大,因此这里求均值。具体矩阵间计算关系可实际写一下就很好理清。

代码语言:javascript
复制
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,并且每次迭代后计算当前输出是否与目标值一致,一致则结束,同时输出迭代次数。
代码语言:javascript
复制
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,就可以计算出直线的斜率与截距,从而画出直线。

代码语言:javascript
复制
#记录正负样本        
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()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习养成记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档