python实现感知器算法详解
作者:修炼之路 发布时间:2022-04-29 15:08:43
在1943年,沃伦麦卡洛可与沃尔特皮茨提出了第一个脑神经元的抽象模型,简称麦卡洛可-皮茨神经元(McCullock-Pitts neuron)简称MCP,大脑神经元的结构如下图。麦卡洛可和皮茨将神经细胞描述为一个具备二进制输出的逻辑门。树突接收多个输入信号,当输入信号累加超过一定的值(阈值),就会产生一个输出信号。弗兰克罗森布拉特基于MCP神经元提出了第一个感知器学习算法,同时它还提出了一个自学习算法,此算法可以通过对输入信号和输出信号的学习,自动的获取到权重系数,通过输入信号与权重系数的乘积来判断神经元是否被激活(产生输出信号)。
一、感知器算法
我们将输入信号定义为一个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。
感知器算法的工作过程:
1、将权重ω初始化为零或一个极小的随机数。
2、迭代所有的训练样本(已知输入和输出),执行如下操作:
a、通过权重和已知的输入计算输出
b、通过a中的输出与已知输入的输出来更新权重
权重的更新过程,如上图的公式,其中ω与x都是相对应的(当ω为ω0的时候,x为1),η为学习率介于0到1之间的常数,其中y为输入所对应的输出,后面的y(打不出来)为a中所计算出来的输出。通过迭代对权重的更新,当遇到类标预测错误的情况下,权重的值会趋于正类别和负类别的方向。
第一个公式表示的是,当真实的输出为1的情况下,而预测值为-1,所以我们就需要增加权重来使得预测值往1靠近。
第二个公式表示的是,当真实的输出为-1的情况下,而预测值为1,所以我们就需要减少权重来使得预测值往-1靠近。
注意:感知器收敛的前提是两个类别必须是线性可分的,且学习率足够小。如果两个类别无法通过一个线性决策边界进行划分,我们可以设置一个迭代次数或者一个判断错误样本的阈值,否则感知器算法会一直运行下去。
最后,用一张图来表示感知器算法的工作过程
二、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)
来源:http://blog.csdn.net/sinat_29957455/article/details/78820084
猜你喜欢
- 函数:endswith()作用:判断字符串是否以指定字符或子字符串结尾,常用于判断文件类型相关函数:判断字符串开头 startswith()
- #!/usr/bin/py2# -*- coding: utf-8 -*-#encoding=utf-8'''
- 在编写python函数时,无意中发现一个问题:python中的变量不能以数字打头,以下函数中定义了一个变量3_num_varchar,执行时
- 外部引入<link href="https://cdn.bootcss.com/animate.css/3.5.2/anim
- 朴素贝叶斯(Naive Bayes,NB):朴素贝叶斯分类算法是学习效率和分类效果较好的分类器之一。朴素贝叶斯算法一般应用在文本分类,垃圾邮
- 本文实例为大家分享了python多线程下信号处理程序示例的具体代码,供大家参考,具体内容如下下面是一个网上转载的实现思路,经过验证,发现是可
- 我将图形编辑程序分为两类:一类(是)绘图程序,利用这种程序可以一个像素一个像素(地)绘制图像;另外一类(是)制图程序,这种程序提供了一组对象
- antd 的 表单校验方法包括 validateFields 和 validateFieldsAndScroll里面可以接收校验字段数组,
- 上一章节我们学习了基础的定义 PPT 的方法以及每一页中的样式,这节课我们将真正的在 PPT 中添加内容,学习一下 pptx 的段落的使用。
- XML的嵌套处理 一般情况下,我们从数据库中查询得到的结果集可能很大,所以从服务器返回到客户端时,数据会被分成若干个页面分别进行传递。此时,
- 本文实例讲述了mysql数据表的基本操作之表结构操作,字段操作。分享给大家供大家参考,具体如下:本节介绍:表结构操作创建数据表、查看数据表和
- 安装淘宝镜像:要安装Angular4。于是我对着一股浓郁口音的视频开启了Angular4安装之旅。那口音说了,ang哥乐4不是那么好装的,由
- 相信大家使用MySQL都有过重装的经历,要是重装MySQL基本都是在最后一步通不过,除非重装操作系统,究其原因就是系统里的注册表没有删除干净
- 内容摘要:图片随机显示是一个应用非常广泛的技巧。比如随机banner的显示,当你进入一个网站时它的banner总是不同的,或者总有内容不同的
- 本文实例讲述了Python Web编程之WSGI协议。分享给大家供大家参考,具体如下:WSGI简介Web框架和Wen服务器之间需要进行通信,
- 阅读目录• 下载MySQL免安装版• 配置MySQL数据库• MySQL环境变量• 安装MySQL数据库 公司服务器是Window
- 数据集数据集为Barcelona某段时间内的气象数据,其中包括温度、湿度以及风速等。本文将利用CNN来对风速进行预测。特征构造对于风速的预测
- 从publish 表中取出第 n 条到第 m 条的记录的sql语句写法:SELECT TOP m-n+1 *&
- 本文针对开发项目中遇到的问题,进行了汇总问题1:如何选择select的option里面的值? 首先会用到一个方法 onchange();这个
- 引子例如,一个人可能会在计算机上存储大量的照片、视频和文档文件,这些文件可能散落在不同的文件夹中,难以管理和查找。该程序可以根据文件类型将这