Python_sklearn机器学习库学习笔记(七)the perceptron(感知器)

  一、感知器

  感知器是Frank Rosenblatt在1957年就职于Cornell航空实验室时发明的,其灵感来自于对人脑的仿真,大脑是处理信息的神经元(neurons)细胞和链接神经元细胞进行信息传递的突触(synapses)构成。

  

  一个神经元可以看做将一个或者多个输入处理成一个输出的计算单元。一个感知器函数类似于一个神经元:它接受一个或多个输入,处理

他们然后返回一个输出。神经元可以实时,错误驱动的学习,神经元可以通过一个训练样本不断的更新参数,而非一次使用整套的数据。实时学习可能有效的处理内存无法容纳的大数据。感知器通常用下面的图形表示:

  x1,x2,x3是输入单元,每个输入单元分别代表一个特征。感知器通常用另外一个输入单元代表一个常用的误差项,但是这个输入单元在图形中通常被忽略了。中间的圆圈是一个计算单元,类似神经元的细胞核。链接输入单元和计算单元的边类似于树突。每条边一个权重,或者一个参数。参数容易解释,如果某个解释变量与阳性类型相关,权重为正,某个解释变量与阴性类型相关,其其权重为负。链接计算单元和输出单元的边类似树突。

  二、激励函数

  感知器通过使用激励函数(activeation function)处理解释变量和模型参数的线性组合对样本分类,计算公式如下所示。解释变量和模型参数的线性组合有时也称为感知器的预激励(preactivation)。

  

  其中,wi是模型参数,b是常误差项,Φ()是激励方程。常用的激励方程有几种。Rosenblatt最初的感知器用的阶跃函数(Heaviside step function或unit step function)作为激励函数。函数公式如下:

  如果加权解释变量的和加上常误差项之和大于0,则激励方程返回1,此时感知器就把样本归类为阳性。否则,激励方程返回0,感知器就把样本归类为阴性。阶跃函数图形如下所示:

  另一个常用的激励函数是逻辑S形(logistic sigmoid)激励函数。这个激励函数的梯度分布可以更有效的计算,在处理后面的ANN算法是十分有效。其计算公式如下:

  

  其中,x是加权输入的和。这个模型与第四章的逻辑方程类似,是解释变量值与模型参数的线性组合,与逻辑回归模型一样。虽然用逻辑S形激励函数的感知器与逻辑回归一样,但是要估计的参数不同。

  三、感知器学习算法

  感知器算法首先需要将权重设置为0或者很小的随机数,然后预测训练样本的类型。感知器是一种错误驱动(error-driven)的学习算法。如果感知器是正确的,算法就继续处理下一样本。如果感知器是错误的,算法就更新权重,重新预测。权重的更新规则如下:

  

  对于每个训练样本来说,每个解释变量的参数值增加α(dj-yj(t))xj,i,dj是样本j的真实类型,yj(t)是样本j的预测类型,xj,i是第i个样本j的解释变量的值,α是控制学习速率的超参数。如果预测正确的,dj-yj(t)等于0,α(dj-yj(t))xj,i也是0,此时,权重不更新。如果预测错误的,权重会按照学习速率,(dj-yj(t))与解释变量的值的乘积增加。

  这里更新的规则与梯度下降法中的权重更新规则类似,都是朝着使样本得到正确分类更新,且更新的幅度是由学习速率控制的。每次遍历一次训练样本成为完成了一世代(epoch)。如果学习完一世代后,所有的样本都正确分类,那么算法会收敛(converge)。学习算法不能保证收敛(例如线性不可分的数据集),因此学习算法还需要一个超参数,算法终止前需要更新的最大世代数

  感知器的二元分类

  下面我们来解决一个分类的案例。假设想从一堆的猫中分辨幼猫和成年猫。数据只有两个解释变量:用来睡觉的天数比例,闹脾气的天数比例。训练数据由下面四个样本构成:

  

  下面的散点图表示这些样本是可以线性可分离的:

  

In [2]: import matplotlib.pyplot as plt

In [3]: from matplotlib.font_manager import FontProperties

In [4]: font = FontProperties(fname = r"c:\windows\fonts\msyh.ttc",size = 10)

In [5]: import numpy as np

In [6]: X = np.array([[0.2,0.1],[0.4,0.6],[0.5,0.2],[0.7,0.9]])

In [7]: y = [0,0,0,1]

In [8]: marker = [‘.‘,‘x‘]

In [9]: plt.scatter(X[:3,0],X[:3,1],marker=‘,‘,s=400)
Out[9]: <matplotlib.collections.PathCollection at 0x6d46208>

In [10]: plt.scatter(X[3,0],X[3,1],marker=‘x‘,s=400)
Out[10]: <matplotlib.collections.PathCollection at 0x6c856a0>

In [11]: plt.xlabel(u‘用来睡觉的天数比例‘,fontproperties = font)
Out[11]: <matplotlib.text.Text at 0x6c9eeb8>

In [12]: plt.ylabel(u‘闹脾气的天数比例‘,fontproperties = font)
Out[12]: <matplotlib.text.Text at 0x6cadef0>

In [13]: plt.title(u‘幼猫和成年猫‘,fontproperties = font)
Out[13]: <matplotlib.text.Text at 0x6cad5c0>
In [14]: plt.show()

  我们的目标是训练一个感知器可以用两个解释变量分辨猫的类型。我们用阳性表示幼猫,用阴性表示成年猫。用感网络图可以呈现感知训练的过程。

  (略)

  (三)感知器解决文档分类

  scikit-learn提供了感知器功能。和我们用过的其他功能类似,Perceptron类的构造器接受超参数设置。Perceptron类有fit_transform()和predict方法,Perceptro类还提供了partial_fit()方法,允许分类器训练流式数据,并作出预测

  在下面的例子当中,我们训练一个感知器对20个新闻类别的数据集进行分类。这个数据集20个网络新闻网站收集了近2万篇新闻。这个数据集经常用来进行文档的分类和聚类实验;scikit-learn提供了下载和读取数据集的简便方法。我们将训练一个感知器识别三个新闻类别:rec.sports.hockey、rec.sport.baseball和rec.auto。scikit-learn的Perceptron也支持多类分类,使用one versus all策略为训练集中每个类型训练分类器。我们将用TF-IDF加权词袋表示新闻文档。partial_fit()方法可以连接HashingVectorizer在内存有限的情况下训练较大的流式数据

  

  首先我们用fetch_20newsgroups()下载并读取数据,和其他内建数据一致,这个函数返回对象包括data,target和target_name属性。我们还去掉了每篇文章的页眉,页脚和引用文献。保留那些让分类更容易的解释变量,我们用TfidfVectorizer生成TF-IDF矢量,训练感知器,然后用测试集评估效果。

资料来源:《Machine Learning With scikit-learn》

时间: 2024-10-12 09:26:40

Python_sklearn机器学习库学习笔记(七)the perceptron(感知器)的相关文章

Python_sklearn机器学习库学习笔记(四)decision_tree(决策树)

# 决策树 import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.cross_validation import train_test_split from sklearn.metrics import classification_report from sklearn.pipeline import Pipeline from sklearn.grid_search import Gr

马哥学习笔记七——LAMP编译安装之MYSQL

1.准备数据存放的文件系统 新建一个逻辑卷,并将其挂载至特定目录即可.这里不再给出过程. 这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录. 2.新建用户以安全方式运行进程: # groupadd -r mysql # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql # chown -R mysql:mysql /mydata/data 3.安装并初始化my

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

Swift学习笔记七:闭包

闭包可以 捕获 和存储其所在上下文中任意常量和变量的引用. Swift 会为您管理在 捕获 过程中涉及到的内存操作. 在 函数 章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一: 1. 全局函数是一个有名字但不会捕获任何值的闭包 2. 嵌套函数是一个有名字并可以捕获其封闭函数域内值的闭包 3. 闭包表达式是一个可以捕获其上下文中变量或常量值的没有名字的闭包 一.闭包表达式 闭包函数类似于Objective-C中的block.下面我们用事实说话: let counts =

第十七篇:博采众长--初探WDDM驱动学习笔记(七)

基于WDDM驱动的DirectX视频加速重定向框架设计与实现 现在的研究生的论文, 真正质量高的, 少之又少, 开题开得特别大, 动不动就要搞个大课题, 从绪论开始到真正自己所做的内容之间, 是东拼西凑地抄概念, 抄公式, 达到字数篇幅的要求, 而自己正真做了什么, 有哪些实际感受, 做出的内容, 相比前面的东拼西凑就几点内容, 之后就草草结束, 步入感谢的段落. 原因不光只有学生自己, 所谓的读研, 如果没有一个环境, 学生有再大的愿望, 再强的毅力, 到头来也只是空无奈. 有些导师要写书,

《机器学习》学习笔记(一)

今天看了两集Stanford 的Machine Learning,先说说感受,在看的过程中,脑海里冒出来一个念头:在中国的大学里,教授们都是好像在做研究,而学生们都是好像在上课,到头来不知道学到了什么,我在屏幕的这边都能感受到他们和我们的不一样. 其实对于机器学习,我是真心不懂,也不知道为什么忽然就想学习一下了,然后看了第一集就觉得实在是太牛X了,他们做的那个爬越障碍物的狗和快速避障的小车,都不是我们能搞出来的,说来也奇怪,我们不是也有他们一样的课程体系吗?照理说在大学里能做出来的东西,我们也应

0806------Linux网络编程----------Echo 网络库 学习笔记

1.Echo网络库的编写 1.1 Echo网络库1.0 1.1.1 Echo网络库 1.0 框架分析 a)class InetAddress: 主要用来定义一个struct sockaddr_in 结构(用自定义端口号初始化),并提供获取这个结构体成员如IP.Port等的接口: b)class Socket : 主要用来把一个普通的 sockfd 变为 listenfd(这里用一个sockfd初始化对象),提供bind .listen.accept 等接口. c)class TcpConnect

python学习笔记七:条件&循环语句

1.print/import更多信息 print打印多个表达式,使用逗号隔开 >>> print 'Age:',42 Age: 42   #注意个结果之间有一个空格符 import:从模块导入函数 import 模块 from 模块 import 函数 from 模块 import * 如果两个模块都有open函数的时候, 1)使用下面方法使用: module1.open()... module2.open()... 2)语句末尾增加as子句 >>> import ma

swift学习笔记(七)自动引用计数

与Object-c一样,swift使用自动引用计数来跟踪并管理应用使用的内存.当实例不再被使用时,及retainCount=0时,会自动释放是理所占用的内存空间. 注:引用计数仅适用于类的实例,因为struct和enumeration属于值类型,也就不牵涉引用,所以其存储和管理方式并不是引用计数. 当一个实例被初始化时,系统会自动分配一定的内存空间,用于管理属性和方法.当实例对象不再被使用时,其内存空间被收回. swift中的引用类型分为三种,即Strong强引用,weak弱引用和无主引用unw