前言:

写完上一篇《KNN算法实现手写数字识别》到现在已经过去了十天,2018年伊始几天同学同事都是各种浪,自己坚持学习实在是痛苦啊!

不悲不气,闲话不多说了,开始自己神经网络的学习旅程吧

---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------

一、单层感知器工作原理

感知器的原型是——神经元模型。是在1943年,由McCulloch 和 Pitts提出,所以也被叫做“M-P神经元模型”。这个模型的工作原理可由下图展示:

  1. 本神经元接收来自N个外界(或其他神经元)的输入信号,
  2. 这些输入信号通过带权重的连接进行传递给本神经元;
  3. 本神经元接收到的总输入将与本神经元的阈值进行比较;
  4. 比较后,通过“激活函数”处理,产生输出

---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------

二、单层感知器部分说明

这篇单层感知器的实现具体是为了研究:已知标签的情况下,平面上的二分类问题

1、输入数据集与标签集说明

# 输入数据
X = np.array([[1,2,3],[1,4,5],[1,1,1],[1,5,3],[1,0,1]])
# 标签
Y = np.array([1,1,-1,1,-1])

这里 X X X的输入维度是3, X i = [ 1 , x i , y i ] X_i=[1,x_i,y_i] Xi​=[1,xi​,yi​]相当于上图中有3个输入支,在这3个输入支中,第一个值"1"相当于偏置值(也可以说与阈值的意义相同),后两个值 [ x i , y i ] [x_i,y_i] [xi​,yi​]组成平面的一个点。实验中一共输入了5组值,每组值对应的正负标签由 Y Y Y存储,我们需要做的就是找到一条直线,将正负值区域划分开

---------------------------------------------------------------------------------------------------------------------

2、权重的初始化

# 权重初始化,取值范围-1到1
W = (np.random.random(X.shape[1])-0.5)*2
print('初始化权值:',W)

随机生成权重,且要求权重范围落在(-1,1),权重的个数与输入支个数相同

---------------------------------------------------------------------------------------------------------------------

3、更新权重函数

实现思路:当随机生成的权重 W W W不能将正负值区域划分开来,就要根据当前输出集和原有标签集差值的大小,乘以输入集 X i X_i Xi​,再乘以学习率 l r lr lr得到改变权重,改变权重加上旧权重,就得到新权重;

#更新权值函数
def get_update():global X,Y,W,lr,nn += 1#新输出:X与W的转置相乘,得到的结果再由阶跃函数处理,得到新输出new_output = np.sign(np.dot(X,W.T))#调整权重: 新权重 = 旧权重 + 改变权重new_W = W + lr*((Y-new_output.T).dot(X))/int(X.shape[0])W = new_W

说明:这里将改变权重除以 i n t ( X . s h a p e [ 0 ] ) int(X.shape[0]) int(X.shape[0])是归一化操作,防止乘积的数值过大;
---------------------------------------------------------------------------------------------------------------------

4、展示函数:求分割线,并画图展示

def get_show():# 所有样本的坐标all_x = X[:, 1]all_y = X[:, 2]# 额外注释标签为-1的负样本的坐标all_negative_x = [1, 0]all_negative_y = [1, 1]# 计算分界线斜率与截距k = -W[1] / W[2]b = -W[0]/ W[2]print('斜率 k=', k)print('截距 b=', b)print('分割线函数:y = ', k,'x +(', b, ')')xdata = np.linspace(0, 5)plt.figure()plt.plot(xdata,xdata*k+b,'r')plt.plot(all_x, all_y,'bo')plt.plot(all_negative_x, all_negative_y, 'yo')plt.show()

下图解释说明斜率与截距怎么求得

---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------

三、单层感知器Python实现

注:由于每次随机生成的初始权重不同,导致每次运行迭代次数不同,求得的分割线也不同,当数据集很大时候,分割线也会越来越精准

源代码附上:

# -*- coding:utf-8 -*-
# -*- author:zzZ_CMing
# -*- 2018/01/11;10:05
# -*- python3.5import numpy as np
import matplotlib.pyplot as pltn = 0            #迭代次数
lr = 0.11        #学习速率# 输入数据
X = np.array([[1,2,3],[1,4,5],[1,1,1],[1,5,3],[1,0,1]])
# 标签
Y = np.array([1,1,-1,1,-1])# 权重初始化,取值范围-1到1
W = (np.random.random(X.shape[1])-0.5)*2
print('初始化权值:',W)def get_show():# 所有样本的坐标all_x = X[:, 1]all_y = X[:, 2]# 额外注释标签为-1的负样本的坐标all_negative_x = [1, 0]all_negative_y = [1, 1]# 计算分界线斜率与截距k = -W[1] / W[2]b = -W[0]/ W[2]print('斜率 k=', k)print('截距 b=', b)print('分割线函数:y = ', k,'x +(', b, ')')xdata = np.linspace(0, 5)plt.figure()plt.plot(xdata,xdata*k+b,'r')plt.plot(all_x, all_y,'bo')plt.plot(all_negative_x, all_negative_y, 'yo')plt.show()#更新权值函数
def get_update():global X,Y,W,lr,nn += 1#新输出:X与W的转置相乘,得到的结果再由阶跃函数处理,得到新输出new_output = np.sign(np.dot(X,W.T))#调整权重: 新权重 = 旧权重 + 改变权重new_W = W + lr*((Y-new_output.T).dot(X))/int(X.shape[0])W = new_Wdef main():for _ in range(100):get_update()print('第',n,'次改变后的权重:',W)new_output = np.sign(np.dot(X, W.T))if (new_output == Y.T).all():print("迭代次数:", n)breakget_show()if __name__ == "__main__":main()

效果展示:

---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------

四、感知器解决异或问题

感知器解决异或问题有两种方式:

  1. 用多个线性函数对区域进行划分,然后再对每个神经元的输出做出逻辑运算。
  2. 对神经元添加非线性项输入,使等效的输入维度变大:我们的输入还只是x1,x2,但是我们添加x1^2, x1*x2, x2^2项后,就由以前的两项可以生成后三项,而且这五项不再是线性的了

方法2的代码如下:

# -*- coding:utf-8 -*-
# -*- author:zzZ_CMing
# -*- 2018/01/11;16:30
# -*- python3.5'''
异或问题的解决方式有:增加非线性项:输入x1,x2;增加x1^2,x1*x2,x2^2
'''import numpy as np
import matplotlib.pyplot as pltn = 0            #迭代次数
lr = 0.11        #学习速率#输入数据分别:偏置值,x1,x2,x1^2,x1*x2,x2^2
X = np.array([[1,0,0,0,0,0],[1,0,1,0,0,1],[1,1,0,1,0,0],[1,1,1,1,1,1]])#标签
Y = np.array([-1,1,1,-1])# 权重初始化,取值范围-1到1
W = (np.random.random(X.shape[1])-0.5)*2
print('初始化权值:',W)def get_show():# 正样本x1 = [0, 1]y1 = [1, 0]# 负样本x2 = [0,1]y2 = [0,1]xdata = np.linspace(-1, 2)plt.figure()plt.plot(xdata, get_line(xdata,1), 'r')plt.plot(xdata, get_line(xdata,2), 'r')plt.plot(x1, y1, 'bo')plt.plot(x2, y2, 'yo')plt.show()def get_line(x,root):a = W[5]b = W[2] + x*W[4]c = W[0] + x*W[1] + x*x*W[3]if root == 1:return (-b+np.sqrt(b*b-4*a*c))/(2*a)if root == 2:return (-b-np.sqrt(b*b-4*a*c))/(2*a)#更新权值函数
def get_update():global X,Y,W,lr,nn += 1#新输出:X与W的转置相乘,得到的结果再由阶跃函数处理,得到新输出new_output = np.dot(X,W.T)#调整权重: 新权重 = 旧权重 + 改变权重new_W = W + lr*((Y-new_output.T).dot(X))/int(X.shape[0])W = new_Wdef main():for _ in range(10000):get_update()get_show()last_output = np.dot(X,W.T)print('最后逼近值:',last_output)if __name__ == "__main__":main()

效果展示:

系列推荐:

【监督学习】1:KNN算法实现手写数字识别的三种方法
---------------------------------------------------------------------------------------------------------------------
【无监督学习】1:K-means算法原理介绍,以及代码实现
【无监督学习】2:DBSCAN算法原理介绍,以及代码实现
【无监督学习】3:Density Peaks聚类算法(局部密度聚类)
---------------------------------------------------------------------------------------------------------------------
【深度学习】1:感知器原理,以及多层感知器解决异或问题
【深度学习】2:BP神经网络的原理,以及异或问题的解决
【深度学习】3:BP神经网络识别MNIST数据集
【深度学习】4:BP神经网络+sklearn实现数字识别
【深度学习】5:CNN卷积神经网络原理、MNIST数据集识别
【深度学习】8:CNN卷积神经网络识别sklearn数据集(附源码)
【深度学习】6:RNN递归神经网络原理、MNIST数据集识别
【深度学习】7:Hopfield神经网络(DHNN)原理介绍
---------------------------------------------------------------------------------------------------------------------
TensorFlow框架简单介绍
---------------------------------------------------------------------------------------------------------------------

【深度学习】1:感知器原理,以及感知器解决异或问题相关推荐

  1. 深度学习(神经网络)[1]——单层感知器

    深度学习(神经网络)[1] -- 单层感知器 算法描述 python实现 示例运行结果 可视化 算法描述 最原始的神经网络模型,类似于神经网络中的单个神经元,该算法局限性也很大,只适用于解决线性可分的 ...

  2. 深度学习入门系列1:多层感知器概述

    本人正在学习<deep learning with python>–Jason Brownlee,有兴趣的可以一起学习. 仅供学习参考,不做商用! 大家好,我技术人Howzit,这是深度学 ...

  3. 将深度学习技术应用于基于情境感知的情绪识别

    目录 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 .QQ交流群:903290195 延世大学和洛桑联邦理工学院(EPFL)的研究团队最近开发了一种新的技术,可以通过分析图像中的人脸和上下 ...

  4. 解析深度学习:卷积神经网络原理与视觉实践

    解析深度学习:卷积神经网络原理与视觉实践 魏秀参 著 ISBN:9787121345289 包装:平装 开本:16开 正文语种:中文 出版社: 电子工业出版社 出版时间:2018-11-01

  5. [深度学习基础] 深度学习基础及数学原理

    图像分类 (image classification) 问题是指, 假设给定一系列离散的类别(categories)(如猫, 狗, 飞机, 货车, ...), 对于给定的图像, 从这些类别中赋予一个作 ...

  6. 好书荐读:阿里达摩院算法专家领衔《深度学习与图像识别:原理与实践》

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia计算机视觉联盟  报道  | 公众号 CVLianMeng 这本书现在当当新书榜排名前三 既然为大 ...

  7. Deep Learning and the Information Bottleneck Principle 深度学习与信息瓶颈原理

    Deep Learning and the Information Bottleneck Principle 深度学习与信息瓶颈原理 摘要 从信息瓶颈(IB)原理的理论框架出发,对深度神经网络(DNN ...

  8. Halcon 深度学习自定义网络模型-ResNet通用网络产生器

    Halcon 深度学习自定义网络模型-ResNet通用网络产生器 备注: 版本要求:halcon21.05++ Python下的ResNet网络模型源码: import torch import to ...

  9. 视频教程-基于深度学习的计算机视觉:原理与实践(上部)-计算机视觉

    基于深度学习的计算机视觉:原理与实践(上部) 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥1 ...

  10. 基于深度学习的计算机视觉:原理与实践

    基于深度学习的计算机视觉:原理与实践(上部) 基于深度学习的计算机视觉:原理与实践(下部) 本课程适合具有一定深度学习基础,希望发展为深度学习之计算机视觉方向的算法工程师和研发人员的同学们. 基于深度 ...

最新文章

  1. 大厂也在用的 6种 数据脱敏方案,别做泄密内鬼
  2. 三阶魔方还原步骤图_研究人员开发的AI成功在1.2秒内还原三阶魔方
  3. python oa系统_用python把C#操作OA的例子重写了一下
  4. r语言remarkdown展示图_R语言—自动报告Markdown笔记
  5. Readhat中作安全基线
  6. 【计算机网络】核心知识归纳总结
  7. [gstreamer][001] Seek issues and so on
  8. java中的多线程来看一看基础了
  9. 分布式缓存系统 Memcached 【转载】
  10. 孩子成绩不好,学艺术还是上中职?
  11. 树莓派从零开始学习记录
  12. [Unity] 利用Culling Group实现LOD和剔除逻辑
  13. 房产交易进化:探索“去中介”无人区
  14. 注册表修复工具+强制卸载工具
  15. begin tran,commit tran和rollback tran的用法
  16. 【哈密顿图】算法分析
  17. 7.PCIE配置空间读写软件
  18. 海康硬盘录像机 rtsp/onvif 视频配置
  19. 《证券投资基金投资流通受限股票估值指引(试行)》解读
  20. Linux-文件类型

热门文章

  1. 使用Python玩转高等数学(1):集合与区间
  2. 教你快速输入六角符号
  3. Ubuntu配置deepin-wine环境安装QQ,微信,百度网盘
  4. 方舟搜服务器就无限崩溃,哪个老哥知道一搜索非官方服务器就闪退的问题谢谢谢谢...
  5. 攻下隔壁女生路由器后,我都做了些什么
  6. 高分6号宽幅(GF6-WFV)卫星数据快速批量处理
  7. 正则表达式数字,字母,汉字组合 必须包含
  8. 个人小额信用贷款主要产品综合比较
  9. 安博河北实训基地java+android
  10. 怎样设置提醒事项提前一天提醒?