一、感知器学习规则

1、把权重初始化为0或者小的随机数

2、对每个训练样本x(i):

a、计算输出值

b、更新权重

输出值为单位阶跃函数预测的预先定义好的类标签,同时更新权重向量w的每个值wj,更准确的表达式为: ,而 

注意:只有两个类线性可分,并且学习速率足够小,这样感知器的收敛性才能得到保证。

二、在python中实现感知器学习算法

代码如下:

import numpy as npclass Perceptron(object):"""Perceptron classifier.Parameters------------eta : floatLearning rate (between 0.0 and 1.0)n_iter : intPasses over the training dataset.random_state : intRandom number generator seed for random weightinitialization.Attributes-----------w_ : 1d-arrayWeights after fitting.errors_ : listNumber of misclassifications (updates) in each epoch."""def __init__(self, eta=0.01, n_iter=50, random_state=1):self.eta = etaself.n_iter = n_iterself.random_state = random_state# 从数据中学习模型def fit(self, X, y):"""Fit training data.Parameters----------X : {array-like}, shape = [n_samples, n_features]Training vectors, where n_samples is the number of samples andn_features is the number of features.y : array-like, shape = [n_samples]Target values.Returns-------self : object"""# rgen为Numpy随机数生成器,随机种子由用户指定,# 因此可以保证在需要时可以重现以前的结果rgen = np.random.RandomState(self.random_state)# 初始权重很小,size为X的特征维数+1# W0+W1+W2+...+Wnself.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])self.errors_ = []for _ in range(self.n_iter):errors = 0for xi, target in zip(X, y):update = self.eta * (target - self.predict(xi))self.w_[1:] += update * xiself.w_[0] += updateerrors += int(update != 0.0)self.errors_.append(errors)return self# 计算净输入def net_input(self, X):"""Calculate net input"""return np.dot(X, self.w_[1:]) + self.w_[0]# 预测def predict(self, X):"""Return class label after unit step"""return np.where(self.net_input(X) >= 0.0, 1, -1)

三、在鸢尾花数据集上训练感知器模型

为了实现感知器,将从鸢尾花数据集加载Setosa和Versicolor两种花的数据,且暂时只考虑以可视化为目的的萼片长度、花瓣长度两个特征。

1、将鸢尾花数据集直接加载到DataFrame对象,然后用tail方法把最后5行数据列出来以确保数据加载的正确性。

import pandas as pddf = pd.read_csv('https://archive.ics.uci.edu/ml/''machine-learning-databases/iris/iris.data', header=None)
df.tail()

图片1-鸢尾花数据集最后五个样本数据

2、接下来,提取与50朵Iris-setosa和50朵Iris-versicolor鸢尾花相对应的前100个类标签,然后转换为整数型的类标签1(versicolor)和-1(setosa),并存入向量y,再调用pandas的DataFrame的方法获得到相应的NumPy表示。

import matplotlib.pyplot as plt
import numpy as np# select setosa and versicolor
y = df.iloc[0:100, 4].values
y = np.where(y == 'Iris-setosa', -1, 1)# 提取前100个样本的萼长和瓣长特征数据
X = df.iloc[0:100, [0, 2]].values# 绘制数据散点图
# 绘制前50个样本的散点图,X[:50, 0]表示前50个样本的萼长数据,X[:50,1]表示瓣长数据
plt.scatter(X[:50, 0], X[:50, 1],color='red', marker='o', label='setosa')
# 绘制后50个样本的散点图,X[50:100, 0]表示前50个样本的萼长数据,X[50:100,1]表示瓣长数据
plt.scatter(X[50:100, 0], X[50:100, 1],color='blue', marker='x', label='versicolor')plt.xlabel('sepal length [cm]')
plt.ylabel('petal length [cm]')
# 显示图例
plt.legend(loc='upper left')plt.show()

图片2-前100个样本的二维散点图

3、由图易得,一个线性的决策边界足以把Setosa花与Versicolor花区分开,因此像感知器这样的现行分类器应该能够完美地对数据集中的花朵进行分类。接下来就是在鸢尾花数据子集上训练感知器算法的时候了

# n_iter代表的是迭代次数
ppn = Perceptron(eta=0.1, n_iter=10)ppn.fit(X, y)
# len(ppn.errors_) + 1 表示 10 + 1 ,然而range(1,11)取不到最后一次,则刚好为迭代次数
plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Number of updates')plt.show()

图片3-分类错误与迭代之间的关系​​​​​​

可以看到,感知器在第6次迭代之后开始收敛,现在应该能够完美地对训练样本进行分类。

4、通过实现一个短小精干的函数来完成二维数据决策边界的可视化,读懂下面这个函数对学习本书后续章节至关重要。

from matplotlib.colors import ListedColormapdef plot_decision_regions(X, y, classifier, resolution=0.02):# 这里的markers、colors都只有5个元素,表示最多分类为5类,# 要是训练多于5个类别的数据则需要适当调整# setup marker generator and color mapmarkers = ('s', 'x', 'o', '^', 'v')colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')# 目标类别有几类,color[:len(np.unique(y))]就表示会使用前几种colorscmap = ListedColormap(colors[:len(np.unique(y))])# plot the decision surface# 此处是分别找到样本特征1、特征2的最大值和最小值x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1# 这里是理解该函数的重点,见后面详细分析!!!!#xx1,xx2都为大小相同的二维数组xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),np.arange(x2_min, x2_max, resolution))# .ravel()表示将二维数组中每行的数据依次放置在一个一维数组中# np.array([xx1.ravel(),xx2.ravel()].T)则将两个一维数组合并为一个二维数组,并转置,则可以类似表示点坐标了# 使用分类器对上述二维数组中的值一一进行预测,得到的Z为一维数组,为各个点的预测结果Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)# 对所得Z进行reshape,变形为xx1的形状Z = Z.reshape(xx1.shape)# contourf表示画出轮廓图# 若此时只有两个类别,则会将图片分成两块不同颜色的区域plt.contourf(xx1, xx2, Z, alpha=0.3, cmap=cmap)# 设置x,y轴的范围plt.xlim(xx1.min(), xx1.max())plt.ylim(xx2.min(), xx2.max())# plot class samples# 假设y仅为两类 1 或者 -1,则 idx就为 0 或者 1# enumerate为枚举的意思# 首先绘制cl = 1 的点,x轴代表特征0,y轴代表特征1,cl = 2 同理# 这样就可以把散点图画出来了for idx, cl in enumerate(np.unique(y)):plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],alpha=0.8, c=colors[idx],marker=markers[idx], label=cl, edgecolor='black')

图示分析:

图4-详细分析代码(1)

图5-详细分析代码(2)

5、利用plot_decision_regions函数绘制出鸢尾花数据集通过感知器ppn分类后的结果

plot_decision_regions(X, y, classifier = ppn)
plt.xlabel('sepal length [cm]')
plt.ylabel('petal length [cm]')
plt.legend(loc = 'upper left')
plt.show()

图6-分类结果

如上图所示,感知器通过学习掌握了决策边界,能够把鸢尾花训练集的样本完美分开。

pythonML学习笔记ch2-perceptron相关推荐

  1. LPCOpen_LPC5411x学习笔记 ch1 + ch2

    LPCOpen_LPC5411x学习笔记 文档编号 TN_AAAA_0000 关键字 LPCOpen, LPC5411x, MCU, ARM 摘要 本技术笔记对LPCOpen_LPC5411x学习笔记 ...

  2. golang 并发与并行学习笔记(一)

    如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人. go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据. ...

  3. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP

    原文地址可以查看更多信息 本文主要参考于:Multilayer Perceptron  python源代码(github下载 CSDN免费下载) 本文主要介绍含有单隐层的MLP的建模及实现.建议在阅读 ...

  4. 机器学习理论《统计学习方法》学习笔记:第二章 感知机

    <统计学习方法>学习笔记:第二章 感知机 2 感知机 2.1 感知机模型 2.2 感知机学习策略 2.2.1 数据的线性可分性 2.2.2 感知机学习策略 2.3 感知机学习算法 2.3. ...

  5. 深度学习入门之PyTorch学习笔记:深度学习介绍

    深度学习入门之PyTorch学习笔记:深度学习介绍 绪论 1 深度学习介绍 1.1 人工智能 1.2 数据挖掘.机器学习.深度学习 1.2.1 数据挖掘 1.2.2 机器学习 1.2.3 深度学习 第 ...

  6. 学习笔记----周志华《机器学习》第五章(神经网络)(一)

    周志华的<机器学习>算作一本入门的宝书.本文是对周志华的机器学习第五章神经网络的学习笔记.在第五章主要涉及的内容:神经网络.常见激活函数.感知机.多层前馈神经网络 .反向传播算法(BP算法 ...

  7. 【Python-pywt】 小波变化库—Pywavelets 学习笔记

    (转载) [Python ]小波变化库--Pywavelets 学习笔记_nanbei2463776506的博客-CSDN博客 https://blog.csdn.net/nanbei24637765 ...

  8. 《Go语言圣经》学习笔记 第十章 包和工具

    <Go语言圣经>学习笔记 第十章 包和工具 目录 包简介 导入路径 包声明 导入声明 包的匿名导入 包和命名 工具 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. G ...

  9. 《Go语言圣经》学习笔记 第二章 程序结构

    Go语言圣经学习笔记 第二章 程序结构 目录 命名 声明 变量 赋值 类型 包和文件 作用域 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记,几乎是书上的内 ...

最新文章

  1. 计算机考研择校分析,上海地区计算机考研择校分析
  2. 没有日志,只有MDF文件如何恢复数据库(转)[
  3. 注解赋值可以是方法_P7笔记,把Spring注解讲的明明白白
  4. ASP.NET MVC+LINQ开发一个图书销售站点(9):编辑目录
  5. 收藏:flex/flash
  6. flexible.js 移动端自适应方案
  7. linux中杀死指定进程,Linux中通过 kill命令 杀死指定进程
  8. treeselect 如何选中多个_转pdf后出现word没有的形状——对象选择窗格(同时选择多个形状、图形)...
  9. 物尽其用-让推荐系统成为你学习的助手
  10. Android ConstraintLayout 最新使用小结
  11. centos,apache运维经验
  12. [翻译] SSKeychain
  13. 屏幕录像专家V2014(附注册码)
  14. 【算法】路径规划中的Dijkstra(狄克斯特拉)与A星算法
  15. 自行搭建 Bitwarden 服务
  16. 差影-Variation Model
  17. 几种常见的光纤接头(ST,SC,LC,FC)
  18. 操作系统---信号量
  19. 苏州新导RFID智能机房资产管理系统,RFID资产管理追踪系统
  20. Java编程入门与应用 P124——例5-4(计算90度的正弦值、0度的余弦值、1的反正切值、120度的弧度值)

热门文章

  1. 腾讯云服务器免费证书验证,免费申请腾讯云https证书方法
  2. java计算机毕业设计ssm“安家”儿童福利院管理系统
  3. 袋鼠云研发手记 | 数栈DTinsight:详解FlinkX中的断点续传和实时采集
  4. 【正点原子FPGA连载】 第四章Vivado软件的安装和使用 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0
  5. 前端知识杂烩(HTML[5]?+CSS篇)
  6. Unity.Time 小白科普
  7. IntelliJ IDEA让你脱键盘,全键盘操作
  8. python线性回归实例_Python机器学习线性回归分析实例 | kTWO-个人博客
  9. 帮助您成为全面的iOS开发者的五个技巧
  10. 考研复试——离散数学