【机器学习】分类算法-KNN算法实践

一、前言

    前面的一篇文章介绍了KNN算法的基本思想,接下来我们就根据B站UP主【abilityjh】老师的节奏,做一个关于KNN算法运用于“约会网站配对”的算法实现。当然,这个实践的代码是一样的,但是理解的话,我是用自己的话来阐述自己敲完这个算法后的理解,可能更多的是一些大白话,大家也可以去看这个老师的原视频,会有很多收获哦!

二、案例介绍

文本数据:

案例描述:我们需要通过这个DataText.txt文档中的数据来测试我们KNN的准确性,该文档有1000条数据,我们把其中一部分拿来做训练集,另一部分拿来做测试集,结合我们的KNN算法就可以来测试KNN算法的准确性。

三、KNN算法实践

(1)实践思路

如图所示:我们先用将我们txt中的文本数据,转化为对应信息的矩阵或者列表,然后我们通过txt中的数据发现“里程数”的数据比其他两项的数据大了很多,如果这样来求未知点和训练数据中点的距离的话,后两项数据太小基本,没有作用,所以这里我们通过0-1标准化对里程数据做归一化处理;然后我们把之前写的KNN算法封装成一个函数调用,再测试KNN准确性即可。(PS:虽然流程简单,但是代码实现过程中还是有很多坑!)

(2)代码实现

①实现文件数据读取

def file2matrix(filename):fr = open(filename)numberOfLines = len(fr.readlines())# 定义一个numberOfLines行,3列的零矩阵# 一定要加两个括号returnMat = np.zeros((numberOfLines, 3))# 标签向量classLabelVector = []fr.close()fr = open(filename)index = 0for line in fr.readlines():# 去掉每一行的前后空格line = line.strip()# 根据tab将数据切割出来,listFromLine就成了一个字符串列表listFromLine = line.split("\t")# listFromLine[0:3]将listFromLine的前三列赋值给returnMat[]数组,因为returnMat有numberOfLines行,就会执行numberOfLines次操作returnMat[index, :] = listFromLine[0:3]# listFromLine[-1]表示最后一列if listFromLine[-1] == 'didntLike':classLabelVector.append(1)elif listFromLine[-1] == 'smallDoses':classLabelVector.append(2)elif listFromLine[-1] == 'largeDoses':classLabelVector.append(3)index += 1fr.close()return returnMat, classLabelVectordatingDataMat, datingLabels = file2matrix("D:/python工具/素材处/KNN(二)/DataText.txt")
print(datingDataMat)
print(datingLabels)

在这段代码中,我觉得最重要的几个点就是:文件读取、对每行数据处理(确保能分割成矩阵或者列表!)。代码的理解,我都打上了注释,大家可以仔细看看。

效果:

②数据归一化处理

从上面的数据,可以看出里程数的数值是很大的,然后我们用0-1标椎化做处理,将里程数的每个数据缩小在0~1之间。

# 数据归一化处理
# 0-1标注化
def autoNorm(dataSet):# min(0)按特征的列选取,min(1)按照特征的行选取minVals = dataSet.min(0)maxVals = dataSet.max(0)# shape记录了dataSet的行和列normDataSet = np.zeros(dataSet.shape)normDataSet = (dataSet - minVals) / (maxVals - minVals)return normDataSetdataSet = autoNorm(datingDataMat)
print(dataSet)
print(datingLabels)

效果:

③对KNN代码封装

代码原理上一篇博客已经介绍

# inX输入数据,dataSet测试数据,labels标签,k最近的点的个数
def knn(inX, dataSet, labels, k):dist = (((dataSet - inX) ** 2).sum(1)) ** 0.5sortdDist = dist.argsort()classCount = {}for i in range(k):voteLabel = labels[sortdDist[i]]classCount[voteLabel] = classCount.get(voteLabel, 0) + 1maxType = 0maxCount = -1for key, value in classCount.items():if value > maxCount:maxType = keymaxCount = valuereturn maxType

④调用KNN算法进行测试

m = 0.8
# shape[0]表示行、shape[1]表示列
dataSize = dataSet.shape[0]
print("数据集的总行数:", dataSize)
# 80%作为训练 20%作为测试
trainSize = int(m * dataSize)
testSize = int((1 - m) * dataSize)
k = 5
result = []
error = 0
# 调用封装好的KNN函数
for i in range(testSize):# dataSet[trainSize + i - 1, :]表示dataSet矩阵中的第trainSize + i - 1行元素(包含对应的所有列)# dataSet[0:trainSize, :]表示一个从0~trainSize行,包含对应所有列的矩阵# datingLabels[0:trainSize]表示截取列表datingLabels中的0~trainSize个元素result = K.knn(dataSet[trainSize + i - 1, :], dataSet[0:trainSize, :], datingLabels[0:trainSize], k)# result != datingLabels[trainSize + i - 1]表示通过KNN算法得到的result是否与原来的datingLabels中对应下标为trainSize + i - 1是否相等if result != datingLabels[trainSize + i - 1]:error += 1print('错误率:', error / testSize)

这段代码中,我觉得对新手来说最不好理解的就是for循环中的dataSet矩阵的切片操作,我自己也是下来梳理了一下,才通顺起来,相应代码的注解放在代码中了,大家自己取用。

效果:

可见,我们1000条数据,用80%做训练集,20%做测试集,K选用为5用使用KNN算法的出错率,只有5.52%,其实还是可以的。(大家也可以改变数据,再测试一下)

PS:当然KNN算法的优缺点以及使用场景,就不止这些,大家可以下来好好探索一番,我这里就主要梳理一下代码啦!

四、总结

    博主作为一个新手,才开始学习机器学习而言,我觉得这篇关于KNN算法的实践,对自己帮助挺大的,让我学到了以下很多知识:

①关于文件数据的读取;

②数据的处理、归一化;

③函数的封装调用;

④矩阵和列表的一些切片操作;

最后,如果这篇文章对大家有所帮助,别忘了点赞、关注支持博主一波哦~,你们的助力,就是我持续更新的动力!

PS:如果有需要这个DataText.txt数据集的小伙伴,直接私信我,即可发送。

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

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

相关文章

抖音微短剧小程序入驻指南

一、抖音微短剧小程序类目和准入要求是什么? 可以明确的告诉你抖音微短剧小程序入驻是需要报白的,属于定邀类目,官方准入要求如下: 类目要求:文娱-微短剧 定向准入,填写“【微短剧】类目定向邀约申请表”…

【MindSpore学习打卡】应用实践-计算机视觉-SSD目标检测:从理论到实现

在计算机视觉领域,目标检测是一个至关重要的任务。它不仅要求识别图像中的目标物体,还需要精确定位这些物体的位置。近年来,随着深度学习技术的飞速发展,各种高效的目标检测算法层出不穷。SSD(Single Shot MultiBox De…

​埃文科技受邀出席2024 “数据要素×”生态大会​

2024“数据要素”生态大会(以下简称“大会”)于2024年6月30日在河南省郑州市举办,大会主题为“加快数据要素化进程 推动新质生产力发展”。 本次大会旨在搭建高水平交流合作平台、分享前沿观点、展示先进技术、交流实践经验,共同探…

IPSS模块怎么安装到VOS服务器的,到底有没有效果,是不是能大幅度提升VOS3000安全性呢

由于VOS的普及性,不得不承认VOS确实是非常优秀的软交换,但是很多客户在使用过程中都会遇到各种安全问题,比如话费被盗用了,历史话单一堆的非法呼叫话单,严重的影响到了话务安全,并不是那点话费的事了&#…

彻底搞懂Kafka生产消费流程,这篇文章就够了!

Hey, 小伙伴们!今天小米给大家带来一篇关于Kafka生产消费基本流程的揭秘,内容超干货!让我们一起揭开Kafka神秘的面纱,探索它的工作原理吧! Producer创建及其内部结构 当我们创建一个Kafka Producer时,Kafka会为我们创建一个叫做Sender的线程,并将其设置为守护线程(Da…

免费申请 HTTPS 证书的八大方法

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 为了保证网站的安全和数据的隐私性,使用 HTTPS 加密协议已成为必需。HTTPS 证书由受信任的证书颁发机构 (CA) 签发,可以加密客户端和服务器之间的通信。 幸运的是,有许多方法可以免费申请 HTTPS 证书。本文将介绍八种方法…

HTML+CSS笔记

标签 HTML标签 网页的大包围 整体网页内容的外衣 所有的网页文档内容都要写在 html标签内 lang属性,是指内容语言的,目的是让浏览器知晓这个页面的主要展示语言 是什么 只跟浏览器的翻译有关 主要展示的语言如果是英语 en,主要展示的语言如果…

Apache NiFi: 数据采集工具详解

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 欢迎关注微信公众号:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&a…

ubuntu 安装说明

最近准备学习Linux,所以下载了最新的ubuntu server版本24.04,将安装步骤记录下来供参考。 1.安装 挂载光驱和iso文件,启动虚拟机。启动后,你会看到 GRUB 菜单上有两个选项: Try or Install Ubuntu Server 和 Test mem…

电脑怎么录屏?3个超简单的方法,你一定要学会

在数字化时代,电脑录屏早已不再是一个新鲜词汇,看到他人分享的精彩录屏视频,您是否也想自己制作一些精彩视频出来供自己欣赏或分享给他人。那么,电脑怎么录屏?如何让电脑录屏变得更加前沿、有趣和高效呢?今…

WPF UI InkCanvas 导师演示画板 演示 笔记 画笔 识别

<Grid><InkCanvas Name"inkCanvas"/><Button Content"识别" Click"Button_Click" VerticalAlignment"Bottom"/></Grid> 引用内库 Ink ink new Ink(); private void Button_Click(object sender, RoutedEvent…

13-错误-ERROR: duplicate key value violates unique constraint “ux_xxx“

13-错误-ERROR: duplicate key value violates unique constraint “ux_xxx” 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯…

从零到一:eBay自养号测评全流程解析与实操建议

eBay自养号测评是一种通过模拟真实买家行为&#xff0c;为卖家提供市场反馈并提升店铺权重和排名的技术手段。以下是进行eBay自养号测评的具体步骤和注意事项&#xff1a; 一、准备阶段 1. 技术配置&#xff1a;搭建境外服务器&#xff1a;选择稳定的境外服务器&#xff0c;模…

TPS54331 带载输出电压不稳定

TPS54331 带载输出电压不稳定 一、问题概述 TPS54331电源芯片&#xff0c;搭建DC12V转DC5V供电回路。TPS54331芯片外围电路是按照官网给的原理图搭建的&#xff0c;如下图1所示&#xff0c;但是在外围电路器件的布局上没有按照官网器件位置布局&#xff0c;如下图2所示&#x…

七月开刷|50天吃透660+880‼️

现在只刷一本题集根本不够 去做做24年的考研真题卷就什么都明白了&#xff0c;24年的卷子就是典型的知识点多&#xff0c;杂&#xff0c;计算量大。 而现在市面上的任何一本题集&#xff0c;都无法做到包含所有的知识点&#xff0c;毕竟版面有限&#xff01; 所以&#xff0…

【教学类-55-07】20240705图层顺序挑战2*2、3*3、4*4(优化版)

背景需求: 今天有小红书上有一位客户定了“2*2、3*3、4*4”的图层挑战。 我打开原来写代码 【教学类-55-06】20240517图层顺序挑战(二格长条纸加黑色边框、2*2、3张,不重复12张,4坐标点颜色哈希值去重、保留3色)-CSDN博客文章浏览阅读1k次,点赞41次,收藏18次。【教学类…

Android zygote访谈录

戳蓝字“牛晓伟”关注我哦&#xff01; 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章&#xff0c;技术文章也可以有温度。 本文摘要 本文以访谈的方式来带大家了解zygote进程&#xff0c;了解zygote进程是啥&#xff1f;它的作用是啥&#xff1f;它是如何一步…

什么是声明式编程?发展趋势怎么样的?

一、什么是声明式编程&#xff1f; 声明式编程&#xff08;Declarative programming&#xff09;是一种编程范式&#xff0c;与命令式编程相对立。它主要描述目标的性质&#xff0c;让计算机明白目标&#xff0c;而非具体的执行流程。在声明式编程中&#xff0c;开发者只需声明…

简谱六线谱有什么区别 简谱六线谱五线谱哪个好 简谱和五线谱的关系 吉他初学者入门教程视频 吉他软件下载安装

音乐是生活的调味剂&#xff0c;相信许多小伙伴们都十分热爱音乐&#xff0c;有些小伙伴们甚至还想学习编写音乐歌曲&#xff0c;但是学习编曲是一个系统的过程&#xff0c;在这个过程中碰到困难和阻碍是不可避免的。对于初学者来说&#xff0c;不同类型的曲谱就已经让新手十分…

说明本文档目录是软件开发梳理需求常见问题QA文档,方便客户看,也方便我们的售前人员,需求分析人员,ui设计师,原型绘图人员,思维导图绘图人员查看。

https://doc.youyacao.com/117/2150 说明 本文档目录是软件开发梳理需求常见问题QA文档&#xff0c;方便客户看&#xff0c;也方便我们的售前人员&#xff0c;需求分析人员&#xff0c;ui设计师&#xff0c;原型绘图人员&#xff0c;思维导图绘图人员查看。 提示 本内容客户…