python与人工智能:KNN近邻法识别手写数字

news/2024/4/29 14:57:01/文章来源:https://blog.csdn.net/m0_70983574/article/details/127246551

机器学习分类?

1 特征(feature)
数据是区分事物和事物的关键。 举例:不同类型的书,我们用书的内容来对它进行分类
2 标签(label)
数据的标签,显示的分类结果。 举例:书属于的类别,例如“计算机”“图形学”“英文书”“教材”等。
3 学习(learning)
将很多数据丢给计算机分析,以此来训练该计算机,培养计算机给数据分类的能力。举例:把很多书交给一个学生, 培养他给书本分类的能力。
4 分类(classification)
定性输出称为分类,或者说是离散变量预测。 举例:预测明天是阴、晴还是雨,就是一个分类任务。
5 回归(regression)
定量输出称为回归,或者说是连续变量预测; 举例:预测明天的气温是多少度,这是一个回归任务;
6 聚类(clustering)
无监督学习的结果。聚类的结果将产生一组集合,集合中的对象与同集合中的对象彼此相似,与其他集合中的对象相异。 举例:没有标准参考的学生给书本分的类别,表示自己认为这些书可能是同一类别的

 模型

我们告诉小明这个动物是猫,那个也是猫。但突然一只狗跑过来,你告诉他,这个不是狗。久而久之,小明就会产生 认知模式。这个学习过程,就叫“训练”。所形成的认知模式,就是”模型“。 训练之后。这时,再跑过来一个动物时,你问小明,这个是猫吧? 他会回答,是/否。这个就叫,预测在python中我们将海量的数据对我们建立的模型进行训练之后,我们就可以通过模型来预测我们需要的数据

损失函数

是用来度量模型预测值f(x)与样本真实标签值y的不一致程度。给定输入的样本数据x,模型函数输出一个f(x),这个输 出的f(x)与样本的真实值标签值y可能是相同的,也可能是不同的,为了表示我们拟合的好坏,就用一个函数来度量拟 合的程度。
例如:之前我们已经训练了猫的模型了,这时候如果来了一只动物,小明说这是猫,这个结论和真实的结论的距离的 评估算法,我们叫做损失函数,偏差大,预估的是错误的,反之,预估是正确的

优化与过拟合,欠拟合

依据损失函数差值,不断调整模型的过程叫优化,使用的算法实现,叫优化方法,但是一味追求让损失函数达到最小,模型就会面临过拟合问题,导致预测未知数据的效果变差,也就是过度理解,使用简单的模型去拟合复杂数据时,会导致模型很难拟合数据的真实分布,这就会面临欠拟合问题

K近邻法(KNN)

K近邻法(K-Nearest Neighbor,KNN,以下简称KNN) 是一种简单易懂的分类方法,当然,它也可以被用于回归运算中,KNN是一种监督学习。 所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。KNN是一种分(classification)算法,它输入基于实例的学习(instance-based learning),属于懒惰学习(lazy learning)即KNN 没有显式的学习过程,也就是说没有训练阶段,数据集事先已有了分类和特征值,待收到新样本后直接进行处理。
KNN是通过测量不同特征值之间的距离进行分类。 思路是:如果一个样本在特征空间中的k个最邻近的样本中的大多数属于某一个类别,则该样本也划分为这个类别。 KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别 来决定待分样本所属的类别。

让我们来看一个例子吧:

这里我直接从sklearn框架中的neighbors中导入k近邻法的分类器,不再使用数学法去计算点之间的距离:

import numpy as np
import matplotlib.pyplot as plt
# 从neighbors中导入k近邻法的分类器
from sklearn.neighbors import KNeighborsClassifier
def load_data():x = np.array([[0.3, 0.7],[1.2, 8.3],[2.7, 9.5],[3.5, 5.9],[4.1, 8.9],[4.9, 2.4],[5.1, 9.1],[6.8, 3.2],[7.8, 8.7],[8.3, 0.5]])# 准备标签:1表示蓝色阵营,0表示红色阵营y = np.array([1, 1, 1, 1, 1, 1, 0, 0, 0, 0])return x, ydef drawScatter(x, x_test):plt.scatter(x[: 6, 0], x[: 6, 1], c='b')plt.scatter(x[6:, 0], x[6:, 1], c='r')plt.scatter(x_test[0, 0], x_test[0, 1], c='g')plt.show()if __name__ == "__main__":# 获得数据集和标签集x_train, y_train = load_data()# 获得测试点x_test = np.array([[4.5, 0.1]])# 构造分类器对象,指定超参数classifier = KNeighborsClassifier(n_neighbors=7)# 让机器进行假学习训练classifier.fit(x_train, y_train)# 根据假学习得到的模型,进行测试点阵营预测pre = classifier.predict(x_test)print("测试点阵营:", pre)# 绘制图像drawScatter(x_train, x_test)

 注意:数据集和标签集需要一一对应起来。

K近邻法实现鸢尾花的识别

        Iris 鸢尾花数据集是一个经典数据集。数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征: 花萼长度(sepal length in cm)、花萼宽度(sepal width in cm)、花瓣长度(petal length in cm)、花瓣宽度 (petal width in cm)四个特征,将鸢尾花分为三类,分别为Iris Setosa,Iris Versicolour,Iris Virginica,每一类 都有50个样本。
# 从sklearn框架的datasets数据集模块导入load_iris函数
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
def load_data():# 获得框架中提供的鸢尾花数据集data = load_iris()# 提取特征数据,这里是字典类型所以直接间接用【key】来x = data["data"]# 提取标签数据y = data["target"]return x, yif __name__ == "__main__":# 1.获得训练的数据集和标签集x, y = load_data()# 2.获得测试的数据集和测试标签集# tran_test_split:将原始的数据集和标签集按照test_size为0.1的比例# 将原始的数据集和标签集分割成数据训练集,数据测试集,标签训练集,标签测试集# 其中测试集和训练集的记录比为1:9x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)print(x_train, len(x_test), x_test)# 3.创建分类器对象classifier = KNeighborsClassifier(n_neighbors=17)# 4.机器学习训练classifier.fit(x_train, y_train)# 5.预测pre = classifier.predict(x_test)print("预测:", pre)print("真实:", y_test)

K近邻法实现手写数字识别

我们提前准备了2000个0-9的手写文件数据在当前文件夹,首先我们需要将这些数据进行处理成我们需要的数据集和对应的标签集,将每个数字文件的数据都整合成一行,这样我们就得到了【2000,1024】的二维矩阵,方便我们进行处理,但是识别效果其实不好,因为我们准备的手写数字数据量太少了,远远达不到想要的效果

import os
import cv2
import numpy as np
from sklearn.neighbors import KNeighborsClassifierdef load_data():x = []y = []# 遍历目录,得到所有文件名fileList = os.listdir("./trainingDigits/")print(fileList)for file in fileList:with open("./trainingDigits/" + file, "r") as fd:img = []for i in range(32):data = fd.readline()# 将每行数据的末尾的\n除去,循环结束,列表将会存储文件的所有数据,构成(1024, )的数组for j in data[: -1]:img.append(int(j))# 将一张文件的所有有效数据,追加到 x列表中,那么每个文件的数据就成为列表的 一个元素# 循环结束,那么x中将会存储所有文件的数据,构成 二维矩阵,(2000, 1024)x.append(img)# 准备标签y.append(int(file[0]))return x, y
def getTestData(fileName):img = cv2.imread(fileName)img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# img = np.resize(img, (32, 32))# img中图片数据变成  1 * 1024 [[.........]]img = img.reshape(1, -1)print(img.shape)return imgif __name__ == "__main__":# 获得训练的数据集和标签集x_train, y_train = load_data()# 获得测试数据x_test = getTestData("6_1.png")# 构造knn分类器对象classifier = KNeighborsClassifier(3)# 机器学习,训练,得到模型classifier.fit(x_train, y_train)# 预测pre = classifier.predict(x_test)print("预测数字: ", pre)
KNN
l 算法优点:
(1)简单,易于理解,易于实现,无需估计参数。
(2)训练时间为零。
(3)KNN可以处理分类问题,同时天然可以处理多分类问题。
(4)KNN还可以处理回归问题,也就是预测。
(5)和朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感。
l 算法缺点:
(1)计算量太大,尤其是特征数非常多的时候。每一个待分类文本都要计算它到全体已知样本的距离。
(2)可理解性差,无法给出像决策树那样的规则。
(3)是慵懒散学习方法,基本上不学习,导致预测时速度比起逻辑回归之类的算法慢。
(4)样本不平衡的时候,对稀有类别的预测准确率低。当样本不平衡时,如一个类的样本容量很大,而其他类样本容
量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。
(5)对训练数据依赖度特别大,对训练数据的容错性太差。如果训练数据集中,有一两个数据是错误的,刚刚好又在
需要分类的数值的旁边,这样就会直接导致预测的数据的不准确

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

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

相关文章

每日面试题2道、算法两道

目录 一、 面试题 i、i的自增问题 写一个Singleton实例 二、数组 算法 寻找数组的中心索引 搜索插入位置 一、 面试题 i、i的自增问题 /*** packageName: com.sofwin.mianshi* user: wentao* date: 2022/10/10 14:31* email 1660420659qq.com* description: i、i的 面…

(附源码)计算机毕业设计SSM志愿者活动管理平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

pytorch:本地使用tensorboard可视化

摘要: tensorboard是tensorflow用来可视化训练和测试过程的模块,而pytorch并没有可视化模块,但是pytoch1.2.0版本以上开始支持tensorboard。 目录一、 安装tensorboard二、 使用tensorboard1、首先导入模块:2、初始化:…

深度神经网络怎么用

深度学习 对硬件的要求 之前热衷于学习理论知识,目前想跑代码了发现不知道从何下手,自己电脑上搭建的平台基本就是个摆设,因为跑不起来呀。今天我们就来看看想做深度学习应该怎么下手。 首先了解下基础知识:1、深度学习用cpu训练…

2.Jenkins项目创建

Jenkins项目创建1.新建项目 2.创建一个freestyle的项目 3.填写描述信息 4.可以选择丢弃旧的构建 每次构建都会产生一个任务,这个任务想保留多少天,可以设置保留构建的天数 保留最大的个数:例如设置为10个,当任务达到了10个之…

Spring Rest Docs使用

今天给大家分享一个能通过代码自动生成文档技术&#xff0c;Spring Rest Doc过在单元测试中额外添加 API 信息描述&#xff0c;从而自动生成对应的文档片段。 下面通过一个简单的例子演示下如何快速上手的。在Spring Boot项目中添加maven 依赖 <dependency><groupId&g…

Android 使用Jenkins 自动化多渠道打包并且分发到蒲公英、下发到钉钉通知【即拿即用】

前言 一、tomcat 安装启动 二、jenkins war 包下载并安装 三、jenkins 配置教程 四、jenkins items 工程配置 五、android gradle 脚本编码 六、分发到蒲公英脚本编码以及七、通知钉钉逻辑编码 前言 Android 在每个版本测试阶段&#xff0c;通常会因为修复BUG 去验证&#x…

理解vue中的.sync和.$emit

首先来说一下 .sync 修饰符的作用 第一步&#xff1a;先用一句话解释 .sync修饰符可以实现子组件与父组件的双向绑定&#xff0c;并且可以实现子组件同步修改父组件的值。 第二步&#xff1a;具体解释 一般情况下&#xff0c;想要实现父子组件间值的传递&#xff0c;通常使用…

英文论文要怎么查重?

英文论文查重和中文查重一样&#xff0c;只是在渠道选择方面会有些许差别。今天就具体聊聊英文论文怎么查重&#xff0c;并向大家推荐几个比较常用的英文论文查重工具。 英文论文怎么查重&#xff1a; 1、论文为什么要查重 2、论文查重的原理 3、英文论文怎么查重 4、选择…

柳州楼顶种植水稻 国稻种芯·中国水稻节:广西12万亩米飘香

柳州楼顶种植水稻 国稻种芯中国水稻节&#xff1a;广西12万亩米飘香 广西新闻网-南国今报柳江讯&#xff08;记者钟华 通讯员梁睿&#xff09;新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农…

RabbitMQ常用消息模式

目录 1、RabitMQ工作队列 2、交换机 3、RabbitMQ Fanout 发布订阅--- Fanout exchange(扇型交换机) 3.1、创建连接代码 3.1、生产者代码 3.2、消费者代码 4、Direct路由模式 4.1、生产者代码 4.2、消费者代码 5、Topic主题模式 5.1、生产者代码 5.2、消费者代码 1、…

分享两套企业级进销存管理系统源码

▶▶▶▶1&#xff1a;SpringBoot企业级进销存ERP管理系统源码 00189 本系统采用企业级开发标准&#xff0c;使用SpringBoot架构&#xff0c;数据访问层采用Spring Data Jpa&#xff0c;业务控制层采用SpringMvc&#xff0c;安全框架采用Shiro&#xff0c;实现了完整权限系…

风控模型别只会KS、AUC了,来看看其他衡量模型好坏的一些重要指标吧|含实操

当我们训练好一个机器学习模型之后&#xff0c;必然会对模型的综合性能进行评估&#xff0c;针对分类、回归、聚类等不同类型的算法模型&#xff0c;可以采用相关的评价指标&#xff0c;例如分类模型的Accuracy、KS等&#xff1b;回归模型的MAE、MSE等&#xff1b;聚类模型的SS…

Linux下编写C使用的GDB调试器

目录 1.GDB调试器 2.GDB使用 3.实例程序调试 &#xff08;1&#xff09;编写一段C程序 &#xff08;2&#xff09;对C程序进行编译 &#xff08;3&#xff09;调试阶段 ①启动调试 ②查看文件 ③设置断点 ④查看断点情况 ⑤运行代码 ⑥单步运行 ⑦恢复程序 ⑧查看…

数字孪生建筑工程系统开发案例方案,如何选择数孪平台?

据统计&#xff0c;全国建筑业增长值在 GDP 增长中所占比重连续十年保持在 6. 85%以上&#xff0c;其支柱产业的地位依然保持。但是我国建筑业产值利润率已连续五年下滑&#xff0c;部分原因是其生产方式粗放、信息化水平不高、科技创新能力不足等。因此&#xff0c;在发展数字…

java类加载机制解析

一&#xff1a;类加载流程 public class Math {public static final int initData 666;public static User user new User();public int compute(){int a 1;int b 2;return ab;};public static void main(String[] args){Math math new Math();math.compute();} } 当我们…

Mybatis批量插入数据

前言 在很多业务场景中&#xff0c;我们需要批量录入数据。那么意味着我们需要以最高效的方式去实现功能&#xff0c;同时也需要保证软件的便捷性与可维护性&#xff0c;开源字节使用MyBatis foreach标签方式优雅的实现了材料的出入库。源码开放&#xff0c;可前往码云仓库免费…

NR 物理层编码 - slide7 卷积码

前言&#xff1a; 卷积码(n,k,N) 是一种非分组码.与线性分组码的区别: 是一种有记忆的编码方案,n个输出不仅与当前k个输入有关系,也与移位寄存器前N个输入有关系. 发展历史&#xff1a; 1955年 麻省理工的P.Elias 发明 1957年 序列译码法 1963年 门限译码法 1967年 Vi…

MongoDB分片机制

为什么需要分片 应用层实现的手动分片&#xff1a; MongoDB分片组件 mongos路由器负责将应用程序的请求指引到合适的分片上。注意到mongos路由器是在应用程序端实现的&#xff0c;因此分片的配置信息需要保存在另外的服务器上&#xff0c;即配置服务器。mongos通过两阶段提交同…

使用PreparedStatement对数据库的增删改查

目录 介绍 JDBCUtils自定义工具类 增 删 改 查 介绍 可以通过调用 Connection 对象的 preparedStatement() 方法获取PreparedStatement 对象PreparedStatement 接口是 Statement 的子接口&#xff0c;它表示一条预编译过的 SQL 语句PreparedStatement 对象所代表的 SQL 语…