手把手教你使用Python从零开始搭建感知器

大家好,今天本文将展示如何从零开始实现神经网络的最基本要素(感知器),以及人工智能的基本模块背后的数学原理。

虽然人工智能和机器学习等术语已经成为流行词汇,每天都会听到或谈论这些概念,但它们背后的数学概念已经存在了很长时间(从40年代起就有介绍人工神经网络-ANN的论文)。其有几个很好的优势:

  • 现在有大量的数据可用于训练神经网络,而且在处理大型、复杂的问题上,人工神经网络经常优于其他机器学习技术。

  • 自20世纪90年代以来,计算能力大幅增加,现在可以在合理的时间内训练大型神经网络。这在一定程度上归功于摩尔定律,但在另一方面也要感谢游戏行业,他们生产了数以百万计功能强大的GPU卡。

  • 训练算法已经得到改进。平心而论,它们与20世纪90年代使用的算法只有细微的不同,但这些相对较小的调整产生了巨大的积极影响。

一、简介

感知器是神经网络的基本构建模块,为我们提供了对机器学习和人工智能世界的简单而强大的了解。本文将探索感知器的本质,并学习如何从零开始实现它们。感知器在人工智能的发展中具有重要的历史意义,为现代深度学习模型奠定了基础。感知器在概念上的简单性使其成为任何希望掌握神经网络基础知识的人的理想起点。

接下来,本文将深入探讨感知器的架构和内部工作原理,提供代码示例和实用见解,以确保你对这一基本概念有扎实的理解。因此,接下来将使用以下Python软件包来实现感知器。

import numpy as np
import matplotlib.pyplot as plt
import random
import math

二、感知器架构

感知器由以下核心部件组成:

1. 输入特征

输入特征代表感知器用于做出决策的原始数据,本文将定义两个具有固定值的输入(X1X2),以简化神经网络。然而在实际应用中,神经元可能会使用多个输入来表示不同的输入信息。

X = [1, 0]

2. 权重

在此本文将生成用于组成神经网络的权重,我们将首先生成较小的随机权重,但需要注意的是,这些权重将在网络训练时更新。下面的代码展示了如何生成两个介于-11之间的随机权重(每个输入一个)。

w = []
nInputs = 2
for i in range(nInputs):w.append(random.uniform(-1, 1))   

3. 偏置

偏置项是感知器的附加输入项,用作可调节的阈值,它允许感知器在所有输入特征为零时也能做出决策。偏置有助于控制感知器的激活,本文将初始偏置设置为一个小的随机数。

b = random.uniform(-1,1)

4. 激活函数

激活函数将加权输入的总和转换为二进制输出,该输出是感知器的预测结果,表示一个决策或分类,通常我们希望激活函数的输出为01。另一个关键属性是其可微分性,这在网络训练中起着至关重要的作用。函数的可微分性是在训练过程中调整网络权重的不可或缺的要求,使网络能够从数据中学习并随着时间的推移进行改进。

用于此目的的一个非常常见的函数是sigmoid函数,因为它具有可微分性、平滑性和简单的梯度。

def sigmoid(x):return 1/(1+math.exp(-x))

5. 前馈

现在我们已经掌握了设计感知器的基本元素,我们必须将输入数据传递给感知器,这一步称为前馈。首先我们计算输入数据的加权和,然后将结果通过激活函数传递给感知器。

加权和只是权重向量和输入之间的点积,然后将其传递给sigmoid函数:

# 加权和 = w1*x1 + w2*x2 ... + b
z = sigmoid(np.dot(X, w) + b)

最后必须应用激活函数来预测输出为0还是1:

def activation(z):return 1 if z >0.5 else 0

 三、训练感知器

到目前为止,我们只能将输入数据传递给感知器,而不知道感知器是否正确。训练阶段对于提高感知器的准确性至关重要,其过程包括对感知器的权重进行多次迭代(epochs)更新。在每个迭代中,我们都要计算输出相对于目标实际值的误差,以便更新权重并使误差最小化:

y_pred = activation(z)
error = y - y_predlr = 0.1
w_new = []
for wi, xi in zip(w, X):w_new.append(wi + lr*error*xi)b_new = b + lr*error

其中,lr是学习率,我们将其值设置为0.1,但也可以根据问题的不同设置为其他值。

因此我们现在拥有更新的权重,重复执行前馈步骤多个周期。通过根据梯度反复调整权重和偏置,网络会逐渐学会做出更好的预测,并随着时间的推移减少误差,这一步骤也被称为反向传播。

四、应用于鸢尾花数据集

到目前为止,大家已经了解感知器的各个部分以及它们的工作原理。接下来,本文将汇总所有学到的知识,创建感知器类,并使用真实数据集来验证感知器的工作原理。

【鸢尾花数据集】https://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html

class Perceptron():def __init__(self,input_size = 2, lr = 0.01, epochs = 20):# 设置默认参数self.lr = lrself.epochs = epochsself.input_size = input_sizeself.w = np.random.uniform(-1, 1, size=(input_size))self.bias = random.uniform(-1,1)self.misses = []def predict(self, X):w = self.wb = self.biasz = sigmoid(np.dot(X,self.w) + b)if z > 0.5:return 1else:return 0def fit(self, X, y):for epoch in range(self.epochs):miss = 0for yi, xi in zip(y, X):y_pred = self.predict(xi)# 更新权重以最小化误差error = yi - y_predself.w += self.lr*error*xiself.bias += self.lr*errormiss += int(error != 0.0)# 获取每个时期的错误分类数self.misses.append(miss)

从上面的代码中可以看出:

  • lr:学习率

  • input_size:输入数据的特征数量

  • epochs:训练的迭代次数

  • X:输入数据(样本,特征)

  • y:目标数据(标签0或1)

现在,我们将使用scikit-learn库中鸢尾花数据集的感知器实现:

from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target

该数据集由4个特征(花萼长度、花萼宽度、花瓣长度和花瓣宽度)组成,共有150个样本,分为3个分类(山鸢尾、变色鸢尾和维吉尼亚鸢尾)。为了简化起见,本示例只使用2个特征(花萼长度和花瓣长度)以及山鸢尾和变色鸢尾的样本:

X = X[:100, [0,2]]
y = y[y<2]# 绘制数据
plt.figure(figsize=(16,8))
plt.scatter(X[:50,0], X[:50,1], marker='o', label='setosa')
plt.scatter(X[50:,0], X[50:,1], marker='x', label='virginica')
plt.ylabel('sepal length')
plt.xlabel('petal length')
plt.show()

接下来,我们需要使用标记的数据(X,y)来训练感知器,并查看其性能表现如何:

perceptron = Perceptron()
perceptron.fit(X,y)
print(perceptron.w, perceptron.bias)
#(array([0.09893529, 0.09323132]), -0.763184789232628)

这样,我们就得到了训练的最优权重和偏置。那么感知器在错误分类方面表现如何呢?为此,我们将绘制感知器类别的错误参数:

感知器在训练过程中的错误分类次数

从上图可以看出,感知器在第一个时期出现了12次失误,并持续学习,直到在训练结束时不再犯错。

五、总结

本文成功地实现并训练了一个感知器,并使用真实数据集对其性能进行了评估。

尽管感知器是神经网络的基础模块,但正如我们在文章中所看到的,它也有其局限性:

  • 它在二分类数据集上表现良好;

  • 问题是线性可分的。换句话说,它们只能对可以通过直线或超平面将数据分为两类的数据进行分类;

  • 本文处理的是一个干净的数据集,几乎没有噪声,这使得感知器能够轻松收敛。

克服这些局限性的一种方法是使用更复杂的模型,如具有非线性激活函数的多层感知器(MLP),MLP可以学习非线性决策边界,从而能够解决更复杂的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106337.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux信号 signal()编程

在Linux的进程间通信中可以用signal&#xff08;&#xff09;函数进行信号与信息传递。 1.信号 信号的名字和编号&#xff1a; 每个信号都有一个名字和编号&#xff0c;这些名字都以“SIG”开头&#xff0c;例如“SIGIO ”、“SIGCHLD”等等。 信号定义在signal.h头文件中&am…

网络基础2(1)

HTTP 1.应用层协议2.send和recv单独使用不安全3.URL4.urlencode和urldecode5.HTTP协议格式6.HTTP中的常见请求方法POST&&GET7.HTTP的状态码8.HTTP常见Header &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f6…

精品基于django的房源租房分析系统-Python-爬虫

《[含文档PPT源码等]精品基于django的房源租房分析系统-爬虫》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;Jav…

Linux CentOS7 用户组管理

Linux操作系统基于多用户的设计理念&#xff0c;允许多个用户同时使用系统资源。用户是登录系统并使用系统资源的个体&#xff0c;其都有自己的账户和密码。用户组是将众多用户归类为一组。Linux中的用户和用户组是系统安全和权限管理的基础。本文将探讨Linux中用户组的创建和管…

01-Docker部署MongoDB

命令一键部署 拉取镜像 # docker pull mongdo:4.0.3方式一&#xff1a; 数据为持久化&#xff1a;不挂载容器卷 # docker run -itd --name mongo -p 27017:27017 mongo --auth-itd 交互后台运行容器–name 自定义容器名称 创建mongoDB账号 1&#xff09;进入容器创建数据…

【JUC】原子操作类及LongAddr源码分析

文章目录 1. 十八罗汉2. 原子类再分类2.1 基本类型原子类2.2 数组类型原子类2.3 引用类型原子类2.4 对象的属性修改原子类2.5 原子操作增强类 3. 代码演示及性能比较&#xff1a;4. LongAddr原理5. LongAddr源码分析5.1 add()5.2 longAccumulate()5.3 sum() 6. 小总结6.1 Atomi…

深入理解Kafka分区副本机制

1. Kafka集群 Kafka 使用 Zookeeper 来维护集群成员 (brokers) 的信息。每个 broker 都有一个唯一标识 broker.id&#xff0c;用于标识自己在集群中的身份&#xff0c;可以在配置文件 server.properties 中进行配置&#xff0c;或者由程序自动生成。下面是 Kafka brokers 集群自…

上机实验二 设计单循环链表 西安石油大学数据结构

实验名称:设计单循环链表 (1&#xff09;实验目的:掌握线性表的链式存储结构;掌握单循环链表及其基本操作的实现。 (2&#xff09;主要内容:实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素等操作;用插入法建立带头结点的单循环链表;设计一个测试主函数验证…

hadoop组成

在hadoop1.x时代,Hadoop中的MapReduce同时处理业务逻辑运算和资源调度,耦合性较大; 在hadoop2.x时代,新增了yarn,主要负责资源的调度,MapReduce仅负责运算; 在hadoop3.x时代,在组成上没有变化;

基于枚举实现的观察者模式

文章目录 前言一、观察者1.定义一个观察者接口2.察者接口具体实现类 二、主题1.定义一个主题接口2.主题接口具体实现类 三、枚举维护观察者1.定义枚举类维护观察者 四、观察者模式测试1.定义观察者模式测试接口2.观察者模式测试运行结果 前言 本文介绍使用枚举的方式实现的观察…

2023-10-14 LeetCode每日一题(只出现一次的数字)

2023-10-14每日一题 一、题目编号 136. 只出现一次的数字二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时…

vue上传文件MD5加密

1.下载MD5依赖 npm install crypto-js 2.在utils文件夹中新增文件md5方法文件&#xff0c;文件名自定义&#xff08;fileMd5Sum.js&#xff09; import CryptoJs from crypto-js export default {// md5值计算fileMd5Sum(file) {let CryptoJS require("crypto-js"…

支付宝开放平台第三方代小程序开发,消息服务推送通知总结

大家好&#xff0c;我是小悟 关于支付宝开放平台第三方代小程序开发的消息服务推送通知&#xff0c;是开放平台代小程序实现业务的重要功能。 消息服务推送通知&#xff0c;支持商家两种通讯协议来接收消息&#xff0c;分别为websocket 长连接和http。 关于websocket方式&am…

Zookeeper断网重连事件回调源码分析

“不积跬步&#xff0c;无以至千里。” 背景 确定使用Curator作为zk客户端的情况下&#xff0c;断网[发生SUSPENDED | LOST事件]重连后每次都会回调org.apache.curator.framework.state.ConnectionStateListener#stateChanged方法&#xff0c;且事件类型为org.apache.curator.…

苍穹外卖(八) 使用WebSocket协议完成来单提醒及客户催单功能

WebSocket介绍 WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信(双向传输)——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#xff1a; HTTP…

ChatGPT角色扮演教程,Prompt词分享

使用指南 1、可直复制使用 2、可以前往已经添加好Prompt预设的AI系统测试使用 https://ai.idcyli.comhttps://ai.idcyli.com 雅思写作考官 我希望你假定自己是雅思写作考官&#xff0c;根据雅思评判标准&#xff0c;按我给你的雅思考题和对应答案给我评分&#xff0c;并且按…

LeetCode每日一题:1488. 避免洪水泛滥(2023.10.13 C++)

目录 1488. 避免洪水泛滥 实现代码与解析&#xff1a; 贪心 原理思路&#xff1a; 1488. 避免洪水泛滥 题目描述&#xff1a; 你的国家有无数个湖泊&#xff0c;所有湖泊一开始都是空的。当第 n 个湖泊下雨前是空的&#xff0c;那么它就会装满水。如果第 n 个湖泊下雨前是…

使用 Secrets OPerationS 管理 Kubernetes 密钥

Kubernetes非常受欢迎&#xff0c;很大程度上要归功于它的灵活性。由于其模块化&#xff0c;它还可以快速部署。然而&#xff0c;为了保持这种模块化&#xff0c;您需要以流畅且可定制的方式构建云环境&#xff1b;这意味着确保 ConfigMap 和 Secret 的设计与基础设施无关。 您…

DirectX绘制流水线

使用DirectX可以让在Windows平台上运行的游戏或多媒体程序获得更高的执行效率&#xff0c;掌握DirectX的基本概念和技术是虚拟现实技术、计算机仿真和3D游戏程序开发的基础。 DirectX概述 DirectX是微软的一个多媒体应用编程接口(API)工具包&#xff0c;用于为Windows操作系统…

数组——螺旋矩阵II

文章目录 一、题目二、题解 题目顺序&#xff1a;代码随想录算法公开课&#xff0c;b站上有相应视频讲解 一、题目 59. Spiral Matrix II Given a positive integer n, generate an n x n matrix filled with elements from 1 to n2 in spiral order. Example 1: Input: n …