python实现感知器算法详解


Posted in Python onDecember 19, 2017

在1943年,沃伦麦卡洛可与沃尔特皮茨提出了第一个脑神经元的抽象模型,简称麦卡洛可-皮茨神经元(McCullock-Pitts neuron)简称MCP,大脑神经元的结构如下图。麦卡洛可和皮茨将神经细胞描述为一个具备二进制输出的逻辑门。树突接收多个输入信号,当输入信号累加超过一定的值(阈值),就会产生一个输出信号。弗兰克罗森布拉特基于MCP神经元提出了第一个感知器学习算法,同时它还提出了一个自学习算法,此算法可以通过对输入信号和输出信号的学习,自动的获取到权重系数,通过输入信号与权重系数的乘积来判断神经元是否被激活(产生输出信号)。

python实现感知器算法详解

一、感知器算法

我们将输入信号定义为一个x向量,x=(x1,x2,x3..),将权重定义为ω=(ω1,ω2,ω3...)其中ω0的值为,将z定义为为两个向量之间的乘积,所以输出z=x1*ω1 + x2*ω2+....,然后将z通过激励(激活)函数,作为真正的输出。其中激活函数是一个分段函数,下图是一个阶跃函数,当输入信号大于0的时候输出为1,小于0的时候输出为0,这里的阶跃函数阈值设置为0了。定义激活函数为Φ(z),给激活函数Φ(z)设定一个阈值θ,当激活函数的输出大于阈值θ的时候,将输出划分为正类(1),小于阈值θ的时候将输出划分为负类(-1)。如果,将阈值θ移到等式的左边z=x1*ω1+x2*ω2+....+θ,我们可以将θ看作为θ=x0*ω0,其中输出x0为1,ω0为-θ。将阈值θ移到等式的左边之后,就相当于激活函数的阈值由原来的θ变成了0。

python实现感知器算法详解

感知器算法的工作过程:

1、将权重ω初始化为零或一个极小的随机数。

2、迭代所有的训练样本(已知输入和输出),执行如下操作:

a、通过权重和已知的输入计算输出

b、通过a中的输出与已知输入的输出来更新权重

python实现感知器算法详解

权重的更新过程,如上图的公式,其中ω与x都是相对应的(当ω为ω0的时候,x为1),η为学习率介于0到1之间的常数,其中y为输入所对应的输出,后面的y(打不出来)为a中所计算出来的输出。通过迭代对权重的更新,当遇到类标预测错误的情况下,权重的值会趋于正类别和负类别的方向。

python实现感知器算法详解

第一个公式表示的是,当真实的输出为1的情况下,而预测值为-1,所以我们就需要增加权重来使得预测值往1靠近。

第二个公式表示的是,当真实的输出为-1的情况下,而预测值为1,所以我们就需要减少权重来使得预测值往-1靠近。

注意:感知器收敛的前提是两个类别必须是线性可分的,且学习率足够小。如果两个类别无法通过一个线性决策边界进行划分,我们可以设置一个迭代次数或者一个判断错误样本的阈值,否则感知器算法会一直运行下去。

python实现感知器算法详解

最后,用一张图来表示感知器算法的工作过程

python实现感知器算法详解

二、python实现感知器算法

import numpy as np 
 
class Perceptron(object): 
  ''''' 
  输入参数: 
  eta:学习率,在0~1之间,默认为0.01 
  n_iter:设置迭代的次数,默认为10 
  属性: 
  w_:一维数组,模型的权重 
  errors_:列表,被错误分类的数据 
  ''' 
  #初始化对象 
  def __init__(self,eta=0.01,n_iter=10): 
    self.eta = eta 
    self.n_iter = n_iter 
  #根据输入的x和y训练模型 
  def fit(self,x,y): 
    #初始化权重 
    self.w_ = np.zeros(1 + x.shape[1]) 
    #初始化错误列表 
    self.errors_=[] 
    #迭代输入数据,训练模型 
    for _ in range(self.n_iter): 
      errors = 0 
      for xi,target in zip(x,y): 
        #计算预测与实际值之间的误差在乘以学习率 
        update = self.eta * (target - self.predict(xi)) 
        #更新权重 
        self.w_[1:] += update * xi 
        #更新W0 
        self.w_[0] += update * 1 
        #当预测值与实际值之间误差为0的时候,errors=0否则errors=1 
        errors += int(update != 0) 
      #将错误数据的下标加入到列表中 
      self.errors_.append(errors) 
    return self 
  #定义感知器的传播过程 
  def net_input(self,x): 
    #等价于sum(i*j for i,j in zip(x,self.w_[1:])),这种方式效率要低于下面 
    return np.dot(x,self.w_[1:]) + self.w_[0] 
  #定义预测函数 
  def predict(self,x): 
    #类似于三元运算符,当self.net_input(x) >= 0.0 成立时返回1,否则返回-1 
    return np.where(self.net_input(x) >= 0.0 , 1 , -1)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
python实现基本进制转换的方法
Jul 11 Python
Django项目中用JS实现加载子页面并传值的方法
May 28 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
python-docx文件定位读取过程(尝试替换)
Feb 13 Python
python读取yaml文件后修改写入本地实例
Apr 27 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
基于pandas向csv添加新的行和列
May 25 Python
python 生成正态分布数据,并绘图和解析
Dec 21 Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Apr 24 Python
Python内置类型集合set和frozenset的使用详解
Apr 26 Python
python绘制条形图方法代码详解
Dec 19 #Python
Python实现两款计算器功能示例
Dec 19 #Python
Python构建网页爬虫原理分析
Dec 19 #Python
Python2.X/Python3.X中urllib库区别讲解
Dec 19 #Python
Python实现采用进度条实时显示处理进度的方法
Dec 19 #Python
Python实现矩阵加法和乘法的方法分析
Dec 19 #Python
分析python切片原理和方法
Dec 19 #Python
You might like
php下使用无限生命期Session的方法
2007/03/16 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
Yii学习总结之安装配置
2015/02/22 PHP
PHP 实现文件压缩解压操作的方法
2019/06/14 PHP
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
Javascript alert消息换行的方法
2013/08/07 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
2016/06/15 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
了解JavaScript中let语句
2019/05/30 Javascript
Bootstrap table 服务器端分页功能实现方法示例
2020/06/01 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
python 全局变量的import机制介绍
2017/09/07 Python
pandas series序列转化为星期几的实例
2018/04/11 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
美国最大点评网站:Yelp
2018/02/14 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
工商管理系学生的自我评价分享
2013/11/29 职场文书
品质主管岗位职责
2014/03/16 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
2014年派出所工作总结
2014/11/21 职场文书
2015年世界无车日活动总结
2015/03/23 职场文书
2015年学校教育教学工作总结
2015/04/22 职场文书
党员承诺书范文2015
2015/04/27 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
博物馆观后感
2015/06/05 职场文书