神经网络-感知器(二):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()
- Spark核心RDD、什么是RDD、RDD的属性、创建RDD、RDD的依赖以及缓存、
- Caused by: java.net.ConnectException: Connection refused: master/192.168.3.129:7077
- java.util.zip.ZipException: invalid LOC header (bad signature)
- 递归就这么简单
- Activiti就是这么简单
- WebService就是这么简单
- eclipse中hadoop2.3.0环境部署及在eclipse中直接提交mapreduce任务
- spark on yarn提交任务时一直显示ACCEPTED
- 如何恢复hadoop中被删除的文件
- 多个字段中如何按其中两个进行排序(二次排序)
- Hadoop2.3.0上部署Mahout0.10,并测试单机版与分布式版个性化推荐程序
- 总结5种比较高效常用的排序算法
- 曾经做过的40道程序设计课后习题总结(二)
- 曾经做过的40道程序设计课后习题总结(三)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- TRTC Android端开发接入学习之常见问题(十一)
- 树莓派基础实验7:倾斜开关实验
- Hive SQL经典优化案例
- 树莓派基础实验8:振动开关实验
- 几行代码实现cookie的盗取
- 从apollo的初始化看spring boot 1.5.3启动过程( 一)
- CSRF(跨站请求伪造)学习总结
- windows mysql 8.0 ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
- 树莓派基础实验9:蜂鸣器实验
- 浅谈文件上传漏洞(客户端JS检测绕过)
- java字符串操作:如何实现字符串的反转及替换?
- 树莓派基础实验10:干簧管传感器实验
- Java 字节流 字符流 io流
- 写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分 隔。
- 树莓派基础实验11:U型光电传感器实验