什么是感知器?

生物神经元示意图

感知器的概念类似于大脑基本处理单元神经元的工作原理。神经元由许多由树突携带的输入信号、胞体和轴突携带的一个输出信号组成。当细胞达到特定阈值时,神经元会发出一个动作信号。这个动作要么发生,要么不发生。

类似地,感知器具有许多输入(通常称为特征),这些输入被馈送到产生一个二元输出的线性单元中。因此,感知器可用于解决二元分类问题,其中样本将被识别为属于预定义的两个类之一。

算法

感知器原理图

由于感知器是二元类器(0/1),我们可以将它们的计算定义如下:

让我们回想一下,两个长度为n的向量的点积由下式给出:

函数f(x)= b + w.x是权重和特征向量的线性组合。 因此,感知器是线性分类器-一种使用线性预测器函数进行预测的算法。

权重表示x中每个特征xᵢ 对机器学习模型行为的有效性。特征xᵢ的权重wᵢ越高,对输出的影响就越大。偏差“ b”类似于线性方程式中的截距,它是一个常数,可以帮助机器学习模型以最适合数据的方式进行调整。偏差项假设虚拟输入特征系数x₀= 1。

可以使用以下算法训练模型:

我们考虑用于实现感知器的机器学习数据集是鸢尾花数据集。这个数据集包含描述花的4个特征,并将它们归类为属于3个类中的一个。我们剥离了属于类’ Iris-virginica ‘的数据集的最后50行,只使用了两个类’ Iris-setosa ‘和’ Iris-versicolor ‘,因为这些类是线性可分的,算法通过最终找到最优权重来收敛到局部最小值。

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

def load_data():

URL_='https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'

data = pd.read_csv(URL_, header = None)

print(data)

# make the dataset linearly separable

data = data[:100]

data[4] = np.where(data.iloc[:, -1]=='Iris-setosa', 0, 1)

data = np.asmatrix(data, dtype = 'float64')

return data

data = load_data()

将具有两个特征的数据集可视化,我们可以看到,通过在它们之间画一条直线,可以清楚地分隔数据集。

我们的目标是编写一个算法来找到这条线并正确地对所有这些数据点进行分类。

plt.scatter(np.array(data[:50,0]), np.array(data[:50,2]), marker='o', label='setosa')

plt.scatter(np.array(data[50:,0]), np.array(data[50:,2]), marker='x', label='versicolor')

plt.xlabel('petal length')

plt.ylabel('sepal length')

plt.legend()

plt.show()

现在我们实现上面提到的算法,看看它是如何工作的。我们有4个特征,因此每个特征有4个权重。请记住,我们定义了一个偏置项w₀,假设x₀= 1,使其总共具有5个权重。

我们将迭代次数定义为10。这是超参数之一。在每次迭代时,算法都会为所有数据点计算类别(0或1),并随着每次错误分类更新权重。

如果样本分类错误,则权值将由向相反方向移动的增量更新。因此,如果再次对样本进行分类,结果就会“错误较少”。我们将任何label≤0归类为“0”(Iris-setosa),其它归类为“1”(Iris-versicolor)。

def perceptron(data, num_iter):

features = data[:, :-1]

labels = data[:, -1]

# set weights to zero

w = np.zeros(shape=(1, features.shape[1]+1))

misclassified_ = []

for epoch in range(num_iter):

misclassified = 0

for x, label in zip(features, labels):

x = np.insert(x,0,1)

y = np.dot(w, x.transpose())

target = 1.0 if (y > 0) else 0.0

delta = (label.item(0,0) - target)

if(delta): # misclassified

misclassified += 1

w += (delta * x)

misclassified_.append(misclassified)

return (w, misclassified_)

num_iter = 10

w, misclassified_ = perceptron(data, num_iter)

现在,让我们绘制每次迭代中分类错误的样本数。我们可以看到该算法在第4次迭代中收敛。也就是说,所有样本在第4次通过数据时都已正确分类。

感知器的一个特性是,如果数据集是线性可分离的,那么该算法一定会收敛!

epochs = np.arange(1, num_iter+1)

plt.plot(epochs, misclassified_)

plt.xlabel('iterations')

plt.ylabel('misclassified')

plt.show()

局限性

仅当数据集可线性分离时,单层感知器才有效。

该算法仅用于二元分类问题。但是,我们可以通过在每个类中引入一个感知器来扩展算法以解决多类分类问题。

感知器及其在python中的实现_感知器及其在Python中的实现相关推荐

  1. python新手入门教程思路-Python新手入门教程_教你怎么用Python做数据分析

    Python新手入门教程_教你怎么用Python做数据分析 跟大家讲了这么多期的Python教程,有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了,比较复杂.很多网上 ...

  2. python应用程序开发者_用 NVIDIA ISAAC-SDK 在 Python 中开发机器人应用程序

    图 1 .使用 Jupyter 笔记本和 ISAAC SDK Python API 在 ISAAC Sim 中控制虚拟机器人. NVIDIA ISAAC 软件开发工具包 的模块化和易于使用的感知堆栈继 ...

  3. python response重头开始_你必须学写 Python 装饰器的五个理由

    你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...

  4. dpresult在python中什么意思_动态规划(DP)的整理-Python描述

    今天整理了一下关于动态规划的内容,道理都知道,但是python来描述的方面参考较少,整理如下,希望对你有所帮助,实验代码均经过测试. 请先好好阅读如下内容--什么是动态规划? 摘录于<算法图解& ...

  5. python opencv 录制视频_如何使用OpenCV、Python和深度学习在图像和视频中实现面部识别?...

    Face ID 的兴起带动了一波面部识别技术热潮.本文将介绍如何使用 OpenCV.Python 和深度学习在图像和视频中实现面部识别,以基于深度识别的面部嵌入,实时执行且达到高准确度. 以下内容由 ...

  6. insert 语句的选择列表包含的项多于插入列表中的项_如何定义和使用Python列表(Lists)

    Python中最简单的数据集合是一个列表(list).列表是方括号内用逗号分隔的任何数据项列表.通常,就像使用变量一样,使用=符号为Python列表分配名称. 如果列表中包含数字,则不要在其周围使用引 ...

  7. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  8. 什么是python中子类父类_零基础入门:python中子类继承父类的__init__方法实例

    前言: 今天为大家带来的内容是零基础入门:python中子类继承父类的__init__方法实例!具有不错的参考意义,希望在此能够帮助到各位!(喜欢的话记得点赞转发关注不迷路哦) 使用Python写过面 ...

  9. python字符串单个替换_如何用变量替换列表中的单个字符串?

    我正在编写一个脚本,用python为程序maya创建一个命名约定. 我将使用它来命名脚本创建的所有对象.在 例如,以左膝关节为例.脚本会传递这样的信息 ("bind"," ...

最新文章

  1. 判断某数组是不是二叉树的后序遍历序列 python递归与非递归解法
  2. python爬虫项目实例-Python爬虫开发与项目实战
  3. Vijos p1165 火烧赤壁 离散化+单调栈
  4. 损失函数中正则化项L1和L2的理解
  5. Python字符串的两种方式——百分号方式,format的方式
  6. 猫叫老鼠跑的事件例子
  7. c语言中规定,程序中各函数之间,C语言题库-函数_(参考).doc
  8. Effective C# Item22:使用事件定义外发接口
  9. erl_0015 《硝烟中的erlang》 读书笔记002 “为过载做计划”
  10. [Web Chart系列之一]Web端图形绘制SVG,VML, HTML5 Canvas 技术比较
  11. android uri转file_Android世界:ContentProvider使用
  12. 【赛尔笔记】病患相似度度量简述
  13. 【BZOJ5093】图的价值
  14. word、PDF、html、chm 文件的转换
  15. 最新QQ勋章墙+防撤回V9.6.1版本+实测可用
  16. Springboot实现拦截器与过滤器
  17. B站视频下载助手使用教程
  18. 网易交互设计师微专业C2  设计需求分析与方案选择
  19. 不看你就亏了。。。。
  20. 中大 华科 计算机学院,中国进步“最快”的13所大学,国科大、中大、电子科大、华科升级...

热门文章

  1. SAP Spartacus B2B User list页面的数据加载逻辑
  2. SAP Spartacus的ProductAdapter和OccProductAdapter
  3. SAP Analytics Cloud里的Smart Predict
  4. 小技巧,找出所有check table设置为某个数据库表的数据库表
  5. simulation pipeline after change not refresh issue
  6. 阮一峰react demo代码研究的学习笔记 - how is h1 got parsed - not answer
  7. Why manually change will not trigger text determination case 2
  8. 打印出系统所有即未被assign到business transaction和IBASE component的product ID列表
  9. Application is running in standard simulation mode
  10. ABAP bit 操作