机器学习knnlearn5

import numpy as np
from os import listdir
from sklearn.neighbors import KNeighborsClassifier as kNN# 此函数用于将一个32x32的文本文件转换为一个1x1024的一维向量
def img2vector(filename):"""将32x32的文本文件转换为1x1024的向量:param filename: 要转换的文本文件的文件名:return: 转换后的1x1024向量,如果出现错误则返回None"""try:# 初始化一个1x1024的零向量,用于存储转换后的数据returnVect = np.zeros((1, 1024))# 以只读模式打开指定的文件with open(filename) as fr:# 遍历文件的前32行,因为图像是32x32的for i in range(32):# 读取当前行的内容lineStr = fr.readline()# 遍历当前行的前32个字符for j in range(32):# 将当前字符转换为整数,并存储到向量的相应位置returnVect[0, 32 * i + j] = int(lineStr[j])# 返回转换后的向量return returnVectexcept FileNotFoundError:# 若文件未找到,打印错误信息print(f"错误:文件 {filename} 未找到。")return Noneexcept Exception as e:# 若发生其他未知错误,打印错误信息print(f"错误:处理文件 {filename} 时发生未知错误:{e}")return None# 此函数用于加载训练数据,返回训练数据矩阵和对应的标签列表
def load_training_data():"""加载训练数据:return: 训练数据矩阵和对应的标签列表,如果出现错误则返回None, None"""# 用于存储训练数据的标签hwLabels = []try:# 获取训练数据文件夹下的所有文件名trainingFileList = listdir('trainingDigits')# 计算训练数据的数量m = len(trainingFileList)# 初始化一个m行1024列的零矩阵,用于存储训练数据trainingMat = np.zeros((m, 1024))# 遍历训练数据文件夹下的所有文件for i in range(m):# 获取当前文件名fileNameStr = trainingFileList[i]# 从文件名中提取出对应的数字标签classNumber = int(fileNameStr.split('_')[0])# 将标签添加到标签列表中hwLabels.append(classNumber)# 调用img2vector函数将当前文件转换为向量vector = img2vector(f'trainingDigits/{fileNameStr}')if vector is not None:# 将转换后的向量存储到训练数据矩阵的相应行trainingMat[i, :] = vector# 返回训练数据矩阵和标签列表return trainingMat, hwLabelsexcept FileNotFoundError:# 若训练数据文件夹未找到,打印错误信息print("错误:训练数据文件夹未找到。")return None, Noneexcept Exception as e:# 若发生其他未知错误,打印错误信息print(f"错误:加载训练数据时发生未知错误:{e}")return None, None# 此函数用于加载测试数据,返回测试数据矩阵和对应的标签列表
def load_test_data():"""加载测试数据:return: 测试数据矩阵和对应的标签列表,如果出现错误则返回None, None"""try:# 获取测试数据文件夹下的所有文件名testFileList = listdir('testDigits')# 计算测试数据的数量mTest = len(testFileList)# 初始化一个mTest行1024列的零矩阵,用于存储测试数据testMat = np.zeros((mTest, 1024))# 用于存储测试数据的标签testLabels = []# 遍历测试数据文件夹下的所有文件for i in range(mTest):# 获取当前文件名fileNameStr = testFileList[i]# 从文件名中提取出对应的数字标签classNumber = int(fileNameStr.split('_')[0])# 将标签添加到标签列表中testLabels.append(classNumber)# 调用img2vector函数将当前文件转换为向量vector = img2vector(f'testDigits/{fileNameStr}')if vector is not None:# 将转换后的向量存储到测试数据矩阵的相应行testMat[i, :] = vector# 返回测试数据矩阵和标签列表return testMat, testLabelsexcept FileNotFoundError:# 若测试数据文件夹未找到,打印错误信息print("错误:测试数据文件夹未找到。")return None, Noneexcept Exception as e:# 若发生其他未知错误,打印错误信息print(f"错误:加载测试数据时发生未知错误:{e}")return None, None# 此函数用于进行手写数字识别测试,打印分类结果和错误率
def handwritingClassTest():"""手写数字识别测试"""# 调用load_training_data函数加载训练数据trainingMat, hwLabels = load_training_data()if trainingMat is None or hwLabels is None:# 若加载训练数据失败,直接返回return# 创建一个K近邻分类器对象,设置邻居数量为3,算法为自动选择neigh = kNN(n_neighbors=3, algorithm='auto')# 使用训练数据和标签对分类器进行训练neigh.fit(trainingMat, hwLabels)# 调用load_test_data函数加载测试数据testMat, testLabels = load_test_data()if testMat is None or testLabels is None:# 若加载测试数据失败,直接返回return# 初始化错误计数为0errorCount = 0.0# 计算测试数据的数量mTest = len(testLabels)# 遍历测试数据for i in range(mTest):# 使用训练好的分类器对当前测试数据进行预测classifierResult = neigh.predict(testMat[i].reshape(1, -1))# 打印分类结果和真实标签print(f"分类返回结果为 {classifierResult[0]}\t真实结果为 {testLabels[i]}")if classifierResult[0] != testLabels[i]:# 若分类结果与真实标签不一致,错误计数加1errorCount += 1.0# 打印错误的数量和错误率print(f"总共错了 {int(errorCount)} 个数据\n错误率为 {errorCount / mTest * 100:.2f}%")# 程序入口,当脚本作为主程序运行时,调用handwritingClassTest函数进行测试
if __name__ == '__main__':handwritingClassTest()
# 首先导入鸢尾花数据载入工具
from sklearn.datasets import load_iris
#导入KNN分类模型
from sklearn.neighbors import KNeighborsClassifier
#为了方便可视化,我们再导入matplotlib和seaborn
import matplotlib.pyplot as plt
import seaborn as sns
#加载鸢尾花数据集,赋值给iris变量
iris = load_iris()
#查看数据集的键名
iris.keys()
#查看数据集的特征名称
iris.feature_names
# 查看数据集中的样本分类
iris.target 
#将样本的特征和标签分别赋值给X和y
x, y = iris.data, iris.target 
#查看是否成功
x.shape
#导入数据集拆分工具
from sklearn.model_selection import train_test_split
#将X和y拆分为训练集和验证集
x_train, x_test, y_train, y_test = train_test_split(x,y)
#查看拆分情况
x_train.shape
#创建KNN分类器,参数保持默认设置
knn_clf = KNeighborsClassifier(n_neighbors=6)
#使用训练集拟合模型
knn_clf.fit(x_train,y_train)
#查看模型在训练集和验证集中的准确率print('训练集准确率:%.2f'%knn_clf.score(x_train, y_train))
print('验证集准确率:%.2f'%knn_clf.score(x_test, y_test))# 导入网格搜索
from sklearn.model_selection import GridSearchCV
# 定义一个从1到10的n_neighbors
n_neighbors = tuple(range(1,11,1))
# 创建网格搜索示例,estimator 用knn分类器
# 把刚刚定义的n_neighbors 传入param_grid参数
# cv参数指交叉验证次数为5
cv = GridSearchCV(estimator=KNeighborsClassifier(),param_grid = {'n_neighbors':n_neighbors},cv = 5)
# 使用网络搜索你和数据集
cv.fit(x,y)
# 查看最优参数
cv.best_params_
训练集准确率:0.96
验证集准确率:0.95{'n_neighbors': 6}

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

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

相关文章

git revert 用法实战:撤销一个 commit 或 merge

git revert 1 区别 • 常规的 commit (使用 git commit 提交的 commit) • merge commit 2 首先构建场景 master上的代码 dev开发分支上,添加一个a标签,并commit这次提交 切到master上,再次进行改动和提交 将de…

自然语言处理|高效法律助手:AI如何解析合同条款?

引言:法律 AI 的崛起 在数字化浪潮快速发展的今天,人工智能(AI)已不再是一个陌生的概念,它正以快速发展渗透到各个领域,法律行业也不例外。从智能合同审查到法律风险预测,AI 技术为法律工作带来…

【数据分享】2000—2024年我国乡镇的逐年归一化植被指数(NDVI)数据(年最大值/Shp/Excel格式)

之前我们分享过2000-2024年我国逐年的归一化植被指数(NDVI)栅格数据,该逐年数据是取的当年月归一化植被指数(NDVI)的年最大值!另外,我们基于此年度栅格数据按照行政区划取平均值,得到…

办公网络健康监控(域名健康监控)

需求 办公室访问一些网络经常出现故障 现需要时时观察监控这些网络的健康 包含专线网等其他网络 实施 支持 SNMP 且支持 Webhook 发送报警的开源监控系统 hertzbeat:关系型数据库+时序数据库; Zabbix:关系型数据库; LibreNMS:关系型数据库; Prometheus(包含ale…

蓝桥杯 合并数列

问题描述 小明发现有很多方案可以把一个很大的正整数拆成若干个正整数的和。他采用了其中两种方案,分别将它们列为两个数组: {a₁, a₂, ..., aₙ}{b₁, b₂, ..., bₘ} 两个数组的元素和相同。 定义一次合并操作为:将某个数组中相邻的两…

【行驶证识别】批量咕嘎OCR识别行驶证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式

项目背景 在许多业务场景中,如物流管理、车辆租赁、保险理赔等,常常需要处理大量的行驶证照片复印件。手动录入行驶证上的文字信息,像车主姓名、车辆型号、车牌号码等,不仅效率低下,还容易出现人为错误。借助 OCR(光学字符识别)技术,能够自动识别行驶证图片中的文字信…

个人学习编程(3-29) leetcode刷题

最后一个单词的长度: 思路:跳过末尾的空格,可以从后向前遍历 然后再利用 while(i>0 && s[i] ! ) 可以得到字符串的长度, int lengthOfLastWord(char* s) {int length 0;int i strlen(s) - 1; //从字符串末尾开始//…

PAT甲级(Advanced Level) Practice 1028 List Sorting

原题 1028 List Sorting - PAT (Advanced Level) Practice 题目大意 输入n个学生的id、姓名、分数,再输入C表示对C列进行排序。 id:从小到大排 姓名:姓名不同时从小到大排,相同时id从小到大排 分数:不同时从小到…

UE4学习笔记 FPS游戏制作20 重写机器人和玩家死亡 切换相机和模型

定义父类中的死亡方法 在父类中定义OnDie方法,不需要实现,由子类实现各自的死亡逻辑 新建一个Die方法,处理公共的死亡逻辑 Die的实现: 以前的分离控制现在要延迟做,如果分离了控制器,就无法再获取到玩家的…

Linux信号的诞生与归宿:内核如何管理信号的生成、阻塞和递达?

个人主页:敲上瘾-CSDN博客 个人专栏:Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 一、认识信号 二、信号的产生 1.键盘输入 2.系统调用 3.系统指令 4.硬件异常 5.软件条件 三、信号的保存 1.block 2.pending 3.handler 四、信号…

DeepSeek API集成开发指南——Flask示例实践

DeepSeek API集成开发指南——Flask示例实践 序言:智能化开发新范式 DeepSeek API提供了覆盖自然语言处理、代码生成等多领域的先进AI能力。本文将以一个功能完备的Flask示例系统为载体,详解API的集成方法与最佳实践。通过本案例,开发者可快…

Linux环境下安装部署Docker

windows下连接Linux: 打开终端: //ssh远程连接 ssh root192.168.xx.xx//输入账号密码 root192.168.xx.xxs password: ssh连接成功! 安装Docker: //安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 …

开源CDN产品-GoEdge

一、背景 上篇文章分析了一下CDN的基本原理以及使用代码实现了一个乞丐版的智能DNS调度器。从整个例子我们可以清晰了解到CDN原理,也就那么回事。 但是,之前也讲过了,CDN产品融合的技术比较杂、也比较多。所以我就想着,万物皆有开…

正则表达式-万能表达式

1、正则 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找 出满足你想要的格式的句子. {“basketId”: 0, “count”: 1, “prodId”: #prodId#, “shopId”: 1, “skuId”: #skuId#} #prodId# re相关的文章: https://www.cnblogs.com/Simple-S…

javaWeb Router

一、路由简介 1、什么是路由? - 定义:路由就是根据不同的 URL 地址展示不同的内容或页面。 - 通俗理解:路由就像是一个地图,我们要去不同的地方,需要通过不同的路线进行导航。 2、路由的作用 - 单页应用程序…

【前端】使用 HTML、CSS 和 JavaScript 创建一个数字时钟和搜索功能的网页

文章目录 ⭐前言⭐一、项目结构⭐二、HTML 结构⭐三、CSS 样式⭐四、JavaScript 功能⭐五、运行效果⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈(,NET/Java/Python/C)、数…

聚焦应用常用功能,提升用户体验与分发效率

随着HarmonyOS应用的持续发展,应用的功能将越来越丰富,实际上80%的用户使用时长都会集中在20%的特性上,其余的功能可能也仅仅是面向部分用户。 用户在下载应用时,如果应用包含大量的功能和资源,可能会导致下载时间过长…

OCR 识别案例

OCR 识别案例 注意点:输入图像尺寸比例尽量和参与模型训练的数据集比例相似,识别效果会更好。 1、pytesseract Pytesseract是一个Python的光学字符识别(OCR)工具,它作为Tesseract OCR引擎的封装,允许你在…

IP大洗牌ipv6强势来袭!!!【ipv6配置及应用】

前言 随着时代的发展,IPv4(互联网协议第四版)已逐渐无法满足全球互联网爆炸式增长的需求。自20世纪80年代诞生以来,IPv4凭借其简洁的架构和约43亿的地址容量,支撑了互联网的早期扩张。然而,在移动互联网、物…

OpenAI 推出图像生成新突破:GPT-4o 实现图像编辑对话化

关键要点 OpenAI 推出了 4o 图像生成功能,集成于 GPT-4o,提供精准且逼真的图像生成。 它似乎适用于多种用户,包括免费用户,API 访问预计几周内推出。 安全措施包括 C2PA 元数据和内容屏蔽,限制生成不适当图像。 研究…