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:选项 ...
随机推荐
- [翻译] JKLLockScreenViewController
JKLLockScreenViewController https://github.com/tiny2n/JKLLockScreenViewController Overview It is Loc ...
- 如何获取UITableView中cell的frame值
如何获取UITableView中cell的frame值 这个可以用来处理UITableView弹出键盘的问题 本人视频教程系类 iOS中CALayer的使用 效果: 源码: // // ViewC ...
- 封装NSMapTable并简易的使用
封装NSMapTable并简易的使用 NSMapTable是弱引用的字典,可以用来存储对象,该对象消失了也没有关系,对于控制器越级跳转相当有用:) WeakDictionary.h 与 WeakDic ...
- 为什么mysql要做主从复制?
为什么MySQL要做主从复制(读写分离)? 通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低. 为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主 ...
- SpringBoot+MyBatis连接数据库
SpringBoot通过MyBatis连接数据库有2种方法: 1.注解 2.XML文件 1.注解 1.构建项目 2.添加依赖: <dependencies> <dependency& ...
- HashMap集合特点
>HashMap集合特点 HashMap:是基于哈希表的Map接口实现. 哈希表的作用是用来保证键的唯一性的. 不明白,直接看HashMap的put方法源码 //HashM ...
- 1068. [SCOI2007]压缩【区间DP】
Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小 写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上 ...
- c++ 多态,虚函数、重载函数、模版函数
c++三大特性:封装.继承.多态.封装使代码模块化,继承扩展已存在的代码,多态的目的是为了接口重用 虚函数实现:虚函数表:指针放到虚函数表 多态:同名函数对应到不同的实现 构造父类指针指向子类的对象 ...
- django自带的登录验证功能
django自带的验证机制 from django.shortcuts import render, redirect from django.contrib.auth import authenti ...
- NYOJ 36 LCS(最长公共子序列)
题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=36 最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB ...