zoukankan      html  css  js  c++  java
  • 机器学习:Python实现单层Rosenblatt感知器

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

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

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

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

          下面是详细代码及说明:

    '''
       算法:Rosenblatt感知器=====>单层感知器
       特性:提供快速的计算,能够实现逻辑计算中的NOT、OR、AND等简单计算
    本质:在坐标轴轴里面存在一条直线(面)可以把数据分成两类
    ''' ''' 变量约定:大写表示矩阵或数组,小写表示数字 X:表示数组或者矩阵 x:表示对应数组或矩阵的某个值 ''' ''' 关于学习效率(也叫步长:控制着第n次迭代中作用于权值向量的调节)(下面的参数a): 学习效率过大:收敛速度提高,稳定性降低,即出结果快,但是结果准确性较差 学习效率过小:稳定性提高,收敛速度降低,即出结果慢,准确性高,耗费资源 对于学习效率的确定,有专门的算法,这里不做研究。仅仅按照大多数情况下的选择:折中值 ''' import numpy as np a=0.5 ##学习率 0<a<1 X=np.array([[1,1],[1,0],[0,0],[0,1]]) ##输入 D=np.array([1,1,0,1]) ##期望输出结果 W=np.array([0,0]) ##权重向量 ##硬限幅函数(即标准,这个比较简单:输入v大于0,返回1.小于等于0返回-1) ''' 最后的权重为W([1,1]),则:x+y=0 ==>y=-x 即:分类线方程为:y=-x() ''' def sgn(v): if v>0: return 1 else: return -1 ##激活函数(输出函数) ''' 这里是两个向量相乘,对应的数学公式: a(m,n)*b(p,q)=m*p+n*q 在下面的函数中,当循环中xn=1时(此时W=([1,1])): np.dot(W.T,x)=(1,1)*(1,1)=1*1+1*1=2>0 ==>sgn 返回1 ''' def output(W,x): return sgn(np.dot(W.T,x))##dot表示两个矩阵相乘 ##权重计算函数 ''' 对应数学公式: w(n+1)=w(n)+a(d(n)-y(n))*x(n) 对应下列变量的解释: w(n+1) <= neww 的返回值 w(n) <=oldw(旧的权重向量) a <= a(学习率,范围:0<a<1) d(n) <= d(期望输出值) y(n) <= output的返回值(实际输出值) x(n) <= x(输入值) ''' def neww(oldW,d,x,a): return oldW+a*(d-output(oldW,x))*x ##修正权值 ''' 此循环的原理: 权值修正原理(单样本)==>神经网络每次读入一个样本,进行修正, 样本读取完毕,修正过程结束 ''' i=0 for xn in X: W=neww(W,D[i],xn,a) i+=1 print("最后的权值:",W.T) ##输出结果 print("开始验证结果...") for xn in X: print("D%s and W%s =>%d"%(xn,W.T,output(W,xn))) ##测试准确性: ''' 由上面的说明可知:分类线方程为y=-x,从坐标轴上可以看出: (2,3)属于+1分类,(-2,-1)属于-1分类 ''' print("开始测试...") test=np.array([2,3]) print("D%s and W%s =>%d"%(test,W.T,output(W,test))) test=np.array([-2,-1]) print("D%s and W%s =>%d"%(test,W.T,output(W,test)))

      输出结果:

    >>> 
    最后的权值: [ 1.  1.]
    开始验证结果...
    D[1 1] and W[ 1.  1.] =>1
    D[1 0] and W[ 1.  1.] =>1
    D[0 0] and W[ 1.  1.] =>-1
    D[0 1] and W[ 1.  1.] =>1
    开始测试...
    D[2 3] and W[ 1.  1.] =>1
    D[-2 -1] and W[ 1.  1.] =>-1
    >>> 
  • 相关阅读:
    easyui combobox 实现联动
    smartWizard 和 uploadify 插件
    easyui panel href 引用页面导致的命名冲突问题
    Installshield 多语言安装包 和 安装序列号验证,及如何解决 Failed to set code page for Language 46 问题
    easyui 之tab和portal 在IE9下使用iframe时报未定义错误的解决方法
    easyui datagrid 动态列和前端分页,以及加载Datatable
    easyui 动态创建模式对话框
    移动硬盘一个分区“数据循环冗余错误”要求格式化解决方法
    easyui 开发中的通用类库
    easyui datagrid 工具栏实现方式
  • 原文地址:https://www.cnblogs.com/lc1217/p/6530177.html
Copyright © 2011-2022 走看看