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》
Python_sklearn机器学习库学习笔记(七)the perceptron(感知器)的更多相关文章
- Python_sklearn机器学习库学习笔记(一)_一元回归
一.引入相关库 %matplotlib inline import matplotlib.pyplot as plt from matplotlib.font_manager import FontP ...
- Python_sklearn机器学习库学习笔记(一)_Feature Extraction and Preprocessing(特征提取与预处理)
# Extracting features from categorical variables #Extracting features from categorical variables 独热编 ...
- Python_sklearn机器学习库学习笔记(三)logistic regression(逻辑回归)
# 逻辑回归 ## 逻辑回归处理二元分类 %matplotlib inline import matplotlib.pyplot as plt #显示中文 from matplotlib.font_m ...
- Python_sklearn机器学习库学习笔记(五)k-means(聚类)
# K的选择:肘部法则 如果问题中没有指定 的值,可以通过肘部法则这一技术来估计聚类数量.肘部法则会把不同 值的成本函数值画出来.随着 值的增大,平均畸变程度会减小:每个类包含的样本数会减少,于是样本 ...
- Python_sklearn机器学习库学习笔记(六) dimensionality-reduction-with-pca
# 用PCA降维 #计算协方差矩阵 import numpy as np X=[[2,0,-1.4], [2.2,0.2,-1.5], [2.4,0.1,-1], [1.9,0,-1.2]] np.c ...
- Python_sklearn机器学习库学习笔记(四)decision_tree(决策树)
# 决策树 import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.cross_validat ...
- thon_sklearn机器学习库学习笔记(四)decision_tree(决策树)
# 决策树 import pandas as pd from sklearn.tree import DecisionTreeClassifier from sklearn.cross_validat ...
- python3.4学习笔记(七) 学习网站博客推荐
python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...
- Linux学习笔记(七) 查询系统
1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...
随机推荐
- [转]Linux下查看CPU信息、机器型号等硬件信息
From: http://www.jbxue.com/LINUXjishu/14582.html 查看CPU信息(型号) : # cat /proc/cpuinfo | grep name | cut ...
- C#基础学习之委托的理解和应用
委托的使用和语法定义 委托的使用是由四步来完成的,依次为:声明委托.创建委托对象.委托关联方法.调用 我们用一个例子来说明这四步如何操作,我们完成一个老板委托员工写报告的实例,看如何实现. 首先我们应 ...
- [SHOI2012]回家的路
题目背景 SHOI2012 D2T1 题目描述 2046 年 OI 城的城市轨道交通建设终于全部竣工,由于前期规划周密,建成后的轨道交通网络由2n2n条地铁线路构成,组成了一个nn纵nn横的交通网.如 ...
- ngRouter和ui-router区别
在单页面应用中要把各个分散的视图给组织起来是通过路由机制来实现的.本文主要对 AngularJS 原生的 ngRoute 路由模块和第三方路由模块 ui.router 的用法进行简单介绍,并做一个对比 ...
- logstash 匹配日志格式
2017-05-15 12:06:17 INFO me.cinyi.imapp.push.commons.iospush - 用户ID[1000]-标识[11500], admin推送通知成功, ...
- 关于onscroll函数兼容各浏览器的方法分析
关于window.onscroll函数兼容各浏览器的方法分析 1.当前文档的渲染模式是决定onscroll函数兼容性根本原因 目前浏览器的排版引擎有三种模式:怪异模式(Quirks mode).接近标 ...
- kaggle _Titanic: Machine Learning from Disaster
A Data Science Framework: To Achieve 99% Accuracy https://www.kaggle.com/ldfreeman3/a-data-science-f ...
- Kafka设计解析(五)Kafka性能测试方法及Benchmark报告
转载自 技术世界,原文链接 Kafka设计解析(五)- Kafka性能测试方法及Benchmark报告 摘要 本文主要介绍了如何利用Kafka自带的性能测试脚本及Kafka Manager测试Kafk ...
- Spring整合MyBatis(一)MyBatis独立使用
摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. MyBatis本是Apache的一个开源项目iBatis,2010年这 ...
- HDU2544(dijkstra_邻接矩阵最水的题没有之一)
https://cn.vjudge.net/problem/HDU-2544 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场 ...