解决方案:k-近邻算法实现手写数字识别系统——《机器学习实战》

优采云 发布时间: 2022-12-24 05:59

  解决方案:k-近邻算法实现手写数字识别系统——《机器学习实战》

  一、实验介绍

  1.1 实验内容

  本实验将从电影主题分类的例子入手,详细描述k近邻算法的原理。 之后,我们将使用该算法实现一个手写数字识别系统。

  完整教程及在线练习地址:K近邻算法实现手写数字识别系统1.2实验源码

  本实验来源于图灵教育授权实验室大楼发布的《机器学习实战》一书第2章。 如需系统学习本书,请购买《机器学习实战》。

  为了保证本次实验能够在实验室环境下完成,我们增加了实验截图、代码注释等一系列实验指导,帮助大家更好的实践。

  1.3 实验知识点 1.4 实验环境 1.5 适合人群

  本课程难度中等,适合具有基本Python知识的用户。 如果您了解 numpy,则可以更好地入门本课程。

  1.6 代码获取

  您可以在实验楼获取该项目的代码,作为参考对比学习。

  2、实验原理

  众所周知,电影可以按照题材来分类,但是题材本身是如何定义的呢? 谁来决定一部电影属于哪个主题? 也就是说,同一题材的电影有哪些共同特征? 这些都是电影分类时必须要考虑的问题。 没有一个电影人会说他拍的电影和以前的电影很相似,但我们知道,每一部电影确实可能在风格上与同类型的电影相似。 那么动作片有哪些共同特点,使得动作片非常相似,却又与爱情片有着明显的区别呢? 动作片中也有吻戏,爱情片中也有打斗场面。 我们不能简单地以有没有打架或有吻戏来判断一部电影的类型。 但爱情片中吻戏较多,动作片中打斗场面较多。 根据此类场景在电影中出现的次数,可以用来对电影进行分类。 本章第一节根据电影中出现的亲吻和打斗的次数,使用k近邻算法构建了一个自动对电影类型进行分类的程序。 我们首先用电影分类来解释k近邻算法的基本概念,然后学习如何在其他系统上使用k近邻算法。

  本章介绍第一个机器学习算法:k-近邻算法,非常有效且易于掌握。 首先,我们将探讨 k 最近邻算法的基本理论以及如何使用距离测量对项目进行分类; 然后,我们将使用 Python 从文本文件中导入和解析数据; 然后,本书讨论了当数据源较多时,如何避免计算距离时可能遇到的一些常见错误; 最后用实例说明如何使用k近邻算法完成手写数字识别系统。

  2.1k-最近邻算法概述

  简单的说,k近邻算法就是利用衡量不同特征值之间距离的方法进行分类。

  k-最近邻算法

  本书介绍的第一个机器学习算法是 k 最近邻算法 (kNN)。 它的工作原理是:有一个样本数据集,也叫训练样本集,样本集中的每一个数据都有一个标签,即我们知道样本集中每一个数据与其所属类别的对应关系。 输入没有标签的新数据后,将新数据的每个特征与样本集中数据的相应特征进行比较,然后算法提取样本集中最相似数据(最近邻)的分类标签。 一般来说,我们只选取样本数据集中前k个最相似的数据,这就是k近邻算法中k的来源,通常k是不大于20的整数。最后选择最相似的分类k 个最相似数据中出现的次数作为新数据的分类。

  现在让我们回到前面电影分类的例子,使用k近邻算法对爱情片和动作片进行分类。 曾经有人统计过很多电影的打斗场面和吻戏。 图 2-1 显示了 6 部电影中打斗和接吻的场面数量。 如果有一部电影没看过,如何判断它是爱情片还是动作片? 我们可以使用 kNN 来解决这个问题。

  首先,我们要知道这部名不见经传的电影到底有多少打斗场面和吻戏。 图 2-1 中问号的位置是这部未知电影中镜头数量的图形显示。 具体编号见表2-1。

  即使不知道未知电影属于哪种类型,我们也可以通过某种方式弄清楚。 首先计算未知电影与样本集中其他电影的距离,如表2-2所示。 不用担心这里如何计算这些距离值。 在使用Python实现电影分类应用时,会给出具体的计算方法。

  现在我们已经得到了样本集中所有电影和未知电影的距离,按照距离递增排序,我们可以找到k个最接近的电影。 假设 k=3,最接近的三部电影是 He's Not Really into Dudes、Beautiful Woman 和 California Man。 k近邻算法根据距离最近的三部电影的类型来判断未知电影的类型,而这三部电影都是言情片,所以我们判断未知电影是言情片。

  本章主要讲解如何在实际环境中应用k近邻算法,同时也涉及到如何使用Python工具和相关的机器学习术语。 按照1.5节开发机器学习应用程序的一般步骤,我们使用Python语言开发一个k近邻算法的简单应用程序来验证算法的正确性。

  k近邻算法的一般流程

  

  数据采集:可以使用任何方法。 数据准备:距离计算所需的数值,最好是结构化的数据格式。 分析数据:可以使用任何方法。 Training Algorithm:这一步不适用于k-Nearest Nei*敏*感*词*ors算法。 测试算法:计算错误率。 算法使用:首先需要输入样本数据和结构化输出结果,然后运行k近邻算法判断输入数据属于哪个类别,最后对计算出的类别进行后续处理。 2.2 准备工作:使用Python导入数据

  首先,创建一个名为 kNN.py 的 Python 模块。 本章用到的所有代码都在这个文件中。 读者可以根据自己的习惯学习代码,可以根据本书的学习进度,将代码写在自己创建的Python文件中,也可以直接从本书的源代码中复制kNN.py文件。 我建议读者从头开始创建模块,边学边写代码。

  我们打开Xfce终端,创建实验文件夹KNN

  cd Code

mkdir KNN

cd KNN

touch kNN.py

  那我们先安装NumPy模块。

  sudo pip install numpy

  然后我们可以使用 vim 或 sublime 来编辑我们的 kNN.py 文件。 将以下代码添加到 kNN.py 文件中:

   from numpy import *

import operator

def createDataSet():

group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

labels = ['A','A','B','B']

return group, labels

  在上面的代码中,我们导入了两个模块:第一个是科学计算包NumPy; 第二个是operator模块,k近邻算法在进行排序操作的时候会用到这个模块提供的函数,后面会详细介绍。

  然后保存kNN.py文件,确保我们在kNN.py文件的路径下(/home/shiyanlou/Code/KNN),在Xfce终端输入ipython,进入Python交互开发环境。

  进入Python开发环境后,输入以下命令导入上面编辑的程序模块:

   >>> import kNN

  上面的命令导入了 kNN 模块。 为了保证输入相同的数据集,在kNN模块中定义了函数createDataSet,在Python命令提示符下输入如下命令:

   >>> group,labels = kNN.createDataSet()

<p>

</p>

  上面的命令创建了变量组和标签,在Python命令提示符下输入以下命令,并输入变量名来验证变量是否定义正确:

   >>> group

array([[ 1. , 1.1],

[ 1. , 1. ],

[ 0. , 0. ],

[ 0. , 0.1]])

>>> labels

[&#39;A&#39;, &#39;A&#39;, &#39;B&#39;, &#39;B&#39;]

  这里有4组数据,每组数据有两个已知的属性或特征值。 上述组矩阵的每一行收录不同的数据,我们可以将其视为日志文件中的不同测量点或条目。 由于人脑的局限性,我们通常只能将三维以下的事物形象化。 所以对于简单的数据可视化,我们通常只对每个数据点使用两个特征。

  向量标签收录每个数据点的标签信息,标签收录的元素个数等于组矩阵的行数。 这里我们定义数据点(1, 1.1)为A类,数据点(0, 0.1)为B类。为了说明方便,例子中的值是任意取的,没有给出坐标轴标签. 图 2-2 显示了带有类别标签信息的四个数据点。

  现在我们知道了 Python 如何解析数据,如何加载数据,以及 kNN 算法的工作原理,我们将使用这些方法来完成分类任务。

  2.3 如何测试分类器

  上面我们提到使用kNN算法可以判断一部电影是动作片还是爱情片,也就是说我们可以使用kNN算法实现一个分类器。 我们需要检查分类器给出的答案是否符合我们的预期。 读者可能会问:“分类器什么时候会出错?” 或者“答案总是正确的吗?” 答案是否定的,分类器不会得到100%正确的结果,我们可以使用各种方法检查分类器的准确率。 此外,分类器的性能也会受到各种因素的影响,例如分类器设置和数据集。 不同的算法在不同的数据集上的表现可能完全不同,这也是这部分的 6 章讨论分类算法的原因。

  为了测试分类器的效果,我们可以使用已知答案的数据。 当然,答案不能告诉分类器,要检查分类器给出的结果是否符合预期结果。 通过大量的测试数据,我们可以得到分类器的错误率——分类器给出错误结果的次数除以测试执行的总数。 错误率是一种常用的评价方法,主要用于评价分类器在一定数据集上的性能。 完美分类器的错误率为 0,最差分类器的错误率为 1.0,在这种情况下,分类器根本无法找到一个正确的答案。 读者可以在后面的章节中看到实际的数据示例。

  上一节中介绍的示例是有效的,但实际用处不大。 接下来,本书将使用手写识别系统的测试程序来测试k近邻算法的效果。

  三、实验步骤

  本项目详细步骤可在实验楼查看并在线完成:K近邻算法实现手写数字识别系统

  主要实现步骤:

  1.准备数据:将图像转换为测试向量

  2. 分析数据

  3.测试算法:使用k近邻算法识别手写数字

  四、实验总结

  k近邻算法是最简单有效的数据分类算法。 k最近邻算法是基于实例的学习。 在使用算法时,我们必须要有接近实际数据的训练样本数据。 k近邻算法必须保存所有数据集。 如果训练数据集很大,则必须使用大量的存储空间。 此外,实际使用起来可能非常耗时,因为必须为数据集中的每个数据点计算距离值。 有没有一种算法可以减少存储空间和计算时间的开销? k决策树是k近邻算法的优化版本,可以节省大量的计算开销。

  解决方案:自建Kubernetes logtail日志采集客户端安装方式

  【kubernetes常见日志采集问题及解决方案分析】更多相关文章

  kubernetes常见日志采集问题分析及解决方案

  与传统日志和kubernetes日志相比,传统服务目录是固定的,重启后不会丢失。 不要关注标准和错误日志输出。 容器服务节点不固定。 重启服务会漂移。 您需要注意标准和错误日志输出。 日志文件重新启动后将丢失。 日志目录不固定。 k8s中的日志处理常见的日志采集方案: 1、远程日志将容器中的日志直接写到远程kafka.es等,然后通过logstash等进行处理,缺点是需要修改服务和传输到远程存储。 2.sidecar模式,每个pod运行一个filebeat,logstash等pod共享一个valum...

  自建Kubernetes logtail日志采集客户端安装方法

  自建Kubernetes安装前提是Kubernetes集群1.8及以上版本。 Helm命令已安装,版本2.6.4及以上。 安装步骤在日志服务控制台创建项目,项目名称以k8s-log-custom-开头。 将上述命令中的参数替换,并执行该命令。 尝试 wget ...

  Kubernetes Ingress 日志分析和监控最佳实践

  摘要:Ingress主要提供HTTP层(第7层)路由功能,是目前K8s中HTTP/HTTPS服务的主流暴露方式。 为了简化用户分析和监控Ingress日志的门槛,阿里云容器服务和日志服务将Ingress日志开放,只需要申请一个yaml资源即可完成日志采集等一整套Ingress日志解决方案的部署、分析和可视化。 越来越多的企业开始在K8s集群上搭建服务。 在K8s中,组件通过Service暴露服务,往往...

  Kubernetes Ingress 日志分析入门

  本文主要介绍如何搭建一个基于日志服务的Kubernetes Ingress日志分析平台,并提供一些简单的上手实验,帮助大家快速了解日志服务的相关功能。 部署Ingress日志方案,登录容器服务管理控制台。 将上述 CRD 配置保存为编排模板。 有关编排模板文档,请参阅创建编排模板。 基于此模板创建应用程序,并选择集群的默认命名空间。 apiVersion: /v1alpha1 kind: AliyunLogConfig metadata: # 你的配置...

  SpringCloud微服务实战——搭建企业级开发框架(三十八):搭建ELK日志采集分析系统

  一个好的日志分析系统可以详细记录系统的运行情况,方便我们定位分析系统性能瓶颈,定位系统问题。 上一篇文章讲解了日志的各种业务场景以及日志记录的实现,所以日志记录,相关人员需要对日志数据进行处理和分析。 基于E(ElasticSearch)L(Logstash)K(Kibana)组合的日志分析系统可以说是所有企业的首选方案。 Elasticsearch:分布式。 RESTful 风格的搜索和数据分析引擎,可以快速存储、搜索和分析海量数据。 用于存放ELK中的所有日志数据。 日志…

  使用日志服务采集Kubernetes 日志

  阿里云容器服务 Kubernetes 集群集成日志服务(SLS)。 您可以在创建集群时开启日志服务,快速采集Kubernetes集群的容器日志,包括容器的标准输出和容器内的文本文件。 如果您还没有创建一个新的Kubernetes 集群创建任何Kubernetes 集群,您可以按照本节中的步骤进行操作: 登录容器服务管理控制台。 单击左侧导航栏中的集群,单击右上角的创建 Kubernetes 集群。 进入创建页面后,参见创建Kubernetes集群进行配置。 拖到页面底部,勾选日志服务配置项,也就是说在新建的...

  Kubernetes 日志采集

  

  Kubernetes日志打印方式标准输出docker标准输出日志stdout和stderr,使用docker logs或者kubectl logs查看最新日志(tail)。 如果想看更多的日志,可以到宿主机目录/var/lib/docker/containers中找到所有对应的日志。 标准输出是k8s社区推荐的日志输出方式。 下面将从路径和挂载介绍日志文件。 log4j在默认路径打印日志的使用方法: 如果打印的业务日志没有使用任何挂载方式,那么业务日志默认打在容器内部的目录下。 根据不同...

  日志采集技术分析 inode Inotify

  日志采集技术浅析【阿里】-新手学习导向-红客联盟-Powered by HUC …

  《视频课堂》ELK与Kafka如何搭配,成为文字版的日志采集方案

  视频地址:ELK和Kafka是如何一起玩,成为日志采集方案的 视频文字版 今天带来了一个视频,主要讲一下ELK和Kafka的通信关系。 通过一张通信图,以及一些操作命令,让我们更深入的了解ELK在日志采集过程中和Kafka在消息队列分发过程中,它们是如何配置和使用的,以及它们之间的通信机制希望它对你的学习会有帮助帮助,谢谢! 我们的目标是一个主机host上的服务会产生日志,比如在/var/log目录下会不断产生各种日志记录。 我们称这个采集范围为日志采集源。 这时候我们调用ELK文件采集器...

  Kubernetes 通用日志采集方案

  Kubernetes 常用日志采集方案 学习了 Kubernetes 集群中监控系统的搭建。 除了集群的监控告警,还有一个运维工作非常重要,那就是日志的采集。 应用程序和系统日志的引入可以帮助我们了解集群的内部运行情况,日志对于我们调试问题和监控集群状况也非常有用。 而且大部分应用都会有日志记录,传统的应用大部分都会写入本地的日志文件。 对于容器标准化的应用来说就更简单了,只需要将日志信息写入stdout和stderr,容器默认会将这些日志输出到宿主机上的一个服务器上。

  热点话题

  React Hooks子组件通过props调用父组件的方法

  win7激活客户端停止运行

  观察以下网络界面,尽可能列出测试

  绘制DAG图并找到优化的4元代码

  Winform制作键盘

  根目录使用率为 100%

  

  Mac根据域名查IP

  系带使用

  升级openssh9.1

  快速启动找不到系统路径

  放置网页鼠标后显示

  python3 -m compilea 反编译

  如何将确认按钮添加到 ios 数字键盘

  DMS中如何修改数据库用户名

  webapi上传头像

  unittest 什么以test开头

  serilog如何记录空白日志,没有日期,只记录关键内容

  UID卡B5FF67CBA951

  jupyternotebook侧边栏无法调整

  为什么eta设置为5

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线