如果对Rosenblatt感知器不了解,可以先查看下相关定义,然后对照下面的代码来理解。

代码中详细解释了各步骤的含义,有些涉及到了数学公式的解释。

这篇文章是以理解Rosenblatt感知器的原理为主,所以只实现了单层感知器,比较复杂的

多层的感知器会在后面写到。

下面是详细代码及说明:

  1. '''
  2. 算法:Rosenblatt感知器=====>单层感知器
  3. 特性:提供快速的计算,能够实现逻辑计算中的NOT、OR、AND等简单计算
    本质:在坐标轴轴里面存在一条直线(面)可以把数据分成两类
  4. '''
  5.  
  6. '''
  7. 变量约定:大写表示矩阵或数组,小写表示数字
  8. X:表示数组或者矩阵
  9. x:表示对应数组或矩阵的某个值
  10. '''
  11.  
  12. '''
  13. 关于学习效率(也叫步长:控制着第n次迭代中作用于权值向量的调节)(下面的参数a):
  14. 学习效率过大:收敛速度提高,稳定性降低,即出结果快,但是结果准确性较差
  15. 学习效率过小:稳定性提高,收敛速度降低,即出结果慢,准确性高,耗费资源
  16. 对于学习效率的确定,有专门的算法,这里不做研究。仅仅按照大多数情况下的选择:折中值
  17. '''
  18. import numpy as np
  19. a=0.5 ##学习率 0<a<1
  20. X=np.array([[1,1],[1,0],[0,0],[0,1]]) ##输入
  21. D=np.array([1,1,0,1]) ##期望输出结果
  22. W=np.array([0,0]) ##权重向量
  23.  
  24. ##硬限幅函数(即标准,这个比较简单:输入v大于0,返回1.小于等于0返回-1)
  25. '''
  26. 最后的权重为W([1,1]),则:x+y=0 ==>y=-x
  27. 即:分类线方程为:y=-x()
  28. '''
  29. def sgn(v):
  30. if v>0:
  31. return 1
  32. else:
  33. return -1
  34.  
  35. ##激活函数(输出函数)
  36.  
  37. '''
  38. 这里是两个向量相乘,对应的数学公式:
  39. a(m,n)*b(p,q)=m*p+n*q
  40. 在下面的函数中,当循环中xn=1时(此时W=([1,1])):
  41. np.dot(W.T,x)=(1,1)*(1,1)=1*1+1*1=2>0 ==>sgn 返回1
  42. '''
  43. def output(W,x):
  44. return sgn(np.dot(W.T,x))##dot表示两个矩阵相乘
  45.  
  46. ##权重计算函数
  47. '''
  48. 对应数学公式: w(n+1)=w(n)+a(d(n)-y(n))*x(n)
  49. 对应下列变量的解释:
  50. w(n+1) <= neww 的返回值
  51. w(n) <=oldw(旧的权重向量)
  52. a <= a(学习率,范围:0<a<1)
  53. d(n) <= d(期望输出值)
  54. y(n) <= output的返回值(实际输出值)
  55. x(n) <= x(输入值)
  56. '''
  57. def neww(oldW,d,x,a):
  58. return oldW+a*(d-output(oldW,x))*x
  59.  
  60. ##修正权值
  61. '''
  62. 此循环的原理:
  63. 权值修正原理(单样本)==>神经网络每次读入一个样本,进行修正,
  64. 样本读取完毕,修正过程结束
  65.  
  66. '''
  67. i=0
  68. for xn in X:
  69. W=neww(W,D[i],xn,a)
  70. i+=1
  71.  
  72. print("最后的权值:",W.T)
  73.  
  74. ##输出结果
  75. print("开始验证结果...")
  76. for xn in X:
  77. print("D%s and W%s =>%d"%(xn,W.T,output(W,xn)))
  78.  
  79. ##测试准确性:
  80. '''
  81. 由上面的说明可知:分类线方程为y=-x,从坐标轴上可以看出:
  82. (2,3)属于+1分类,(-2,-1)属于-1分类
  83. '''
  84. print("开始测试...")
  85. test=np.array([2,3])
  86. print("D%s and W%s =>%d"%(test,W.T,output(W,test)))
  87. test=np.array([-2,-1])
  88. print("D%s and W%s =>%d"%(test,W.T,output(W,test)))

输出结果:

  1. >>>
  2. 最后的权值: [ 1. 1.]
  3. 开始验证结果...
  4. D[1 1] and W[ 1. 1.] =>1
  5. D[1 0] and W[ 1. 1.] =>1
  6. D[0 0] and W[ 1. 1.] =>-1
  7. D[0 1] and W[ 1. 1.] =>1
  8. 开始测试...
  9. D[2 3] and W[ 1. 1.] =>1
  10. D[-2 -1] and W[ 1. 1.] =>-1
  11. >>>

机器学习:Python实现单层Rosenblatt感知器的更多相关文章

  1. 神经网络与机器学习第3版学习笔记-第1章 Rosenblatt感知器

    神经网络与机器学习第3版学习笔记 -初学者的笔记,记录花时间思考的各种疑惑 本文主要阐述该书在数学推导上一笔带过的地方.参考学习,在流畅理解书本内容的同时,还能温顾学过的数学知识,达到事半功倍的效果. ...

  2. 神经网络与机器学习 笔记—Rosenblatt感知器收敛算法C++实现

    Rosenblatt感知器收敛算法C++实现 算法概述 自己用C++实现了下,测试的例子和模式用的都是双月分类模型,关于双月分类相关看之前的那个笔记: https://blog.csdn.net/u0 ...

  3. Rosenblatt感知器

    一.定义 Rosenblatt感知器建立在一个线性神经元之上,神经元模型的求和节点计算作用于突触输入的线性组合,同时结合外部作用的偏置,对若干个突触的输入项求和后进行调节. 二.基本计算过程 Rose ...

  4. Coursera机器学习基石 第2讲:感知器

    第一讲中我们学习了一个机器学习系统的完整框架,包含以下3部分:训练集.假设集.学习算法 一个机器学习系统的工作原理是:学习算法根据训练集,从假设集合H中选择一个最好的假设g,使得g与目标函数f尽可能低 ...

  5. 神经网络与机器学习 笔记—多层感知器(MLP)

    多层感知器(MLP) Rosenblatt感知器和LMS算法,都是单层的并且是单个神经元构造的神经网络,他们的局限性是只能解决线性可分问题,例如Rosenblatt感知器一直没办法处理简单异或问题.然 ...

  6. 机器学习:Python实现最小均方算法(lms)

    lms算法跟Rosenblatt感知器相比,主要区别就是权值修正方法不一样.lms采用的是批量修正算法,Rosenblatt感知器使用的 是单样本修正算法.两种算法都是单层感知器,也只适用于线性可分的 ...

  7. python机器学习——感知器

    最近在看机器学习相关的书籍,顺便把每天阅读的部分写出来和大家分享,共同学习探讨一起进步!作为机器学习的第一篇博客,我准备从感知器开始,之后会慢慢更新其他内容. 在实现感知器算法前,我们需要先了解一下神 ...

  8. 机器学习之感知器算法原理和Python实现

    (1)感知器模型 感知器模型包含多个输入节点:X0-Xn,权重矩阵W0-Wn(其中X0和W0代表的偏置因子,一般X0=1,图中X0处应该是Xn)一个输出节点O,激活函数是sign函数. (2)感知器学 ...

  9. 机器学习 —— 基础整理(六)线性判别函数:感知器、松弛算法、Ho-Kashyap算法

    这篇总结继续复习分类问题.本文简单整理了以下内容: (一)线性判别函数与广义线性判别函数 (二)感知器 (三)松弛算法 (四)Ho-Kashyap算法 闲话:本篇是本系列[机器学习基础整理]在time ...

随机推荐

  1. 【吐血整理】SVN命令行,Subversion的正确使用姿势,让版本控制更简单~

    一.写在前面 前面一直博主一直用svn的桌面版本,但看项目经理一直都用的命令行方式,不为性能,还能直接装逼呀!在这里先感谢赵哥,也把它分享给感兴趣的你们~ 二.直接上干货 1. svn checkou ...

  2. 如何让 Git 忽略掉文件中的特定行内容?

    近期在git遇到几个问题,让我重新认识到git的强大性,下面列出来记录一下 有一个数据库的配置文件,在用 git add 添加到 index file 时不能透露了相关配置.而如果用 .gitigno ...

  3. javascript组件的基本结构

    (function(window, undefined) { function JsClassName(cfg) { var config = cfg || {}; this.get = functi ...

  4. java中final小结

    fanal 修饰类,该变量一经赋值,就不能够再修改 修饰类,该类不能让子类继承. 修饰方法,该方法不能被子类重写(隐藏). fanal修饰类与方法的意义 1  某个类或方法实现上已经非常完善,不需要子 ...

  5. java学习笔记——IO部分(遍历文件夹)

    用File类写的一个简单的工具,遍历文件夹,获取该文件夹下的所以文件(含子目录下的文件)和文件大小: /** * 列出指定目录下(包含其子目录)的所有文件 * @author syskey * */ ...

  6. git + tortoisegit安装及配置

    1. 下载Git-2.6.3-64-bit.exe 2. 安装Git-2.6.3-64-bit.exe,安装时可全部默认配置(安装路径可选) 3. 下载TortoiseGit-1.8.16.0-64b ...

  7. JavaScript知识点总结

    JavaScript学习总结1.JavaScript是作用于网络和HTML的一个编程语言.2.JavaScript代码必须放在<script></script>标签之间,Jav ...

  8. Asp.Net 常用工具类之Office-文档操作(6)

    文档一直是老大难问题,君不知,代码用时方恨少!有一套成熟的文件帮助类能很大程度上减少寻找各种资料的时间. 记得以前做一个业务,需要导出协议,一份可编辑,一份不可编辑.那么Word和PDF是最好的选择, ...

  9. BOM基础(一)

    学完了js的基础语法和DOM之后,就要要看看javascript中最后一项BOM了.BOM,全称brower document model,翻译过来就是浏览器对象模型.DOM是文档对象模型,属于BOM ...

  10. spl之文件处理

    spl是php标准库的缩写 spl文件处理类库: SplFileInfo  //是一个类用以获取文件的各种信息SplFileInfo的所有方法如下 方法名            - ---   说明2 ...