尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【机器学习入门】K 近邻 (KNN) 算法超详细教程 —— 从原理到 sklearn 双案例教学
文章目录前言一、KNN 算法核心原理1.1 算法思想1.2 关键要素1.3 算法步骤二、案例一个人性格配对效果预测2.1 数据集介绍2.2 数据可视化3D 散点图2.3 KNN 建模与预测三、案例二鸢尾花分类识别3.1 数据集介绍3.2 数据预处理Z-Score 标准化3.3 完整代码实现总结前言K 近邻K-Nearest Neighbors简称 KNN算法是机器学习中最经典、最易理解的分类算法之一核心思想就是 “近朱者赤近墨者黑”—— 一个样本的类别由它周围最近的 K 个邻居投票决定。本文从原理出发带你用 Python scikit-learn 完整实现案例鸢尾花分类识别。一、KNN 算法核心原理1.1 算法思想KNN 属于有监督学习的分类算法逻辑非常直观给定一个待预测的新样本在训练集中找到与它距离最近的 K 个样本这 K 个样本中出现次数最多的类别就是新样本的预测类别。1.2 关键要素K 值选择K 太小容易受噪声影响过拟合K 太大容易忽略样本差异欠拟合通常通过交叉验证选择最优 K 值。距离度量常用欧氏距离计算样本间相似度公式如下d ( x , y ) ∑ i 1 n ( x i − y i ) 2 d(x,y) \sqrt{\sum_{i1}^{n}(x_i - y_i)^2}d(x,y)i1∑n​(xi​−yi​)2​特征标准化不同特征量纲差异大时必须先做标准化否则数值大的特征会主导距离计算。1.3 算法步骤计算待预测样本与所有训练样本的距离按距离从小到大排序选取距离最小的前 K 个样本统计 K 个样本中各类别的出现次数出现次数最多的类别即为预测结果二、案例一个人性格配对效果预测2.1 数据集介绍使用数据集datingTestSet2.txt共 1000 条样本包含 3 个特征和 1 个标签第 1 列 : 每年旅行里程数第 2 列 : 玩游戏所耗时间百分比第 3 列 : 每周零食消耗数量第 4 列标签人物类型 1 好、2 中、3 差2.2 数据可视化3D 散点图先对数据做三维可视化直观观察三类人群的分布importmatplotlib.pyplotaspltimportnumpyasnp# 加载数据datanp.loadtxt(datingTestSet2.txt)data_1data[data[:,-1]1]adata[:,-1]bdata[a1]data_2data[data[:,-1]2]data_3data[data[:,-1]3]# 绘制3D散点图figplt.figure()axplt.axes(projection3d)ax.scatter(data_1[:,0],data_1[:,1],zsdata_1[:,2],c#00DDAA,markero)ax.scatter(data_2[:,0],data_2[:,1],zsdata_2[:,2],c#FF5511,marker^)ax.scatter(data_3[:,0],data_3[:,1],zsdata_3[:,2],c#000011,marker)ax.set(xlabelXaxes,ylabelYaxes,zlabelZaxes)plt.show()从图中可以清晰看到三类人群在特征空间中呈现明显的聚类分布非常适合用 KNN 做分类。2.3 KNN 建模与预测使用 scikit-learn 的KNeighborsClassifier快速搭建模型importnumpyasnpfromsklearn.neighborsimportKNeighborsClassifier# 加载数据datanp.loadtxt(datingTestSet2.txt)Xdata[:,:-1]# 特征前三列ydata[:,-1]# 标签最后一列# 创建KNN模型K25knnKNeighborsClassifier(n_neighbors25)knn.fit(X,y)# 单样本预测resultknn.predict([[14459,4.458902,0.268444]])print(单样本预测类别,result)# 批量预测predict_datas[[14254,5.946014,1.614244],[22220,5.297865,0.638306],[0,5.757140,1.062373],[16721,0.000000,0.242778]]print(批量预测结果,knn.predict(predict_datas))三、案例二鸢尾花分类识别3.1 数据集介绍使用鸢尾花数据集包含花的四个形态特征和对应的类别标签萼片长 (cm) 花萼的长度萼片宽 (cm) 花萼的宽度花瓣长 (cm) 花瓣的长度花瓣宽 (cm) 花瓣的宽度类型_num 类别标签0 / 1 二分类训练集66 条样本测试集9 条样本3.2 数据预处理Z-Score 标准化由于四个特征的数值范围不同需要先做标准化处理让每个特征均值为 0、方差为 1避免数值大的特征主导距离计算。Z-Score 标准化公式x ′ x − μ σ x \frac{x - \mu}{\sigma}x′σx−μ​其中μ \muμ是均值σ \sigmaσ是标准差。3.3 完整代码实现importpandasaspd# 1. 加载数据 train_datapd.read_excel(鸢尾花训练数据.xlsx)test_datapd.read_excel(鸢尾花测试数据.xlsx)train_Xtrain_data[[萼片长(cm),萼片宽(cm),花瓣长(cm),花瓣宽(cm)]]train_ytrain_data[类型_num]# 2. Z-Score标准化 fromsklearn.preprocessingimportscale datapd.DataFrame()data[萼片长标准化]scale(train_X[萼片长(cm)])data[萼片宽标准化]scale(train_X[萼片宽(cm)])data[花瓣长标准化]scale(train_X[花瓣长(cm)])data[花瓣宽标准化]scale(train_X[花瓣宽(cm)])test_Xtest_data[[萼片长(cm),萼片宽(cm),花瓣长(cm),花瓣宽(cm)]]test_ytest_data[类型_num]data_testpd.DataFrame()data_test[萼片长标准化]scale(test_X[萼片长(cm)])data_test[萼片宽标准化]scale(test_X[萼片宽(cm)])data_test[花瓣长标准化]scale(test_X[花瓣长(cm)])data_test[花瓣宽标准化]scale(test_X[花瓣宽(cm)])# 3. 构建KNN模型 fromsklearn.neighborsimportKNeighborsClassifier knnKNeighborsClassifier(n_neighbors3)knn.fit(data,train_y)train_predictedknn.predict(data)score_trainknn.score(data,train_y)# 4. 模型评估 test_predictedknn.predict(data_test)score_testknn.score(data_test,test_y)print(score_test)# 0.8888888888888888代码说明数据加载用pandas.read_excel()读取 Excel 训练集和测试集特征提取选取四个花的形态特征作为输入类型标签作为输出标准化使用sklearn.preprocessing.scale()做 Z-Score 标准化模型训练KNeighborsClassifier(n_neighbors3)创建 K3 的 KNN 分类器模型评估score()方法直接计算准确率对比训练集和测试集效果总结KNN 核心是 “近朱者赤”通过 K 个最近邻居投票决定类别距离计算 K 值选择 特征标准化 是 KNN 的三大关键特征量纲差异大时标准化是必不可少的预处理步骤scikit-learn 的KNeighborsClassifier可以快速搭建 KNN 模型KNN 适合小数据集、低维特征的分类场景大数据集下效率较低
RELATED

相关推荐

STM32驱动OLED制作指针式电子钟:从硬件选型到图形算法详解

STM32驱动OLED制作指针式电子钟:从硬件选型到图形算法详解

1. 项目概述:从零打造一个桌面上的微型机械美学几年前,我在一个电子爱好者的论坛里看到一个帖子,讨论的是如何用最少的元件做一个有“灵魂”的电子钟。当时大部分方案都是直接用数码管或者点阵屏显示数字,虽然精准,但总…

📅 2026/9/4 23:35:29
PID参数整定实战:从原理到方法,告别玄学调试

PID参数整定实战:从原理到方法,告别玄学调试

1. 从“玄学”到“科学”:PID参数整定的本质是什么?干了这么多年自动化,调试过各种炉子、电机、阀门,最常被问到的问题之一就是:“这PID参数到底怎么调?” 很多刚入行的朋友,甚至一些有经验但没…

📅 2026/9/14 23:31:14
初学STM32,我遇到的那些问题

初学STM32,我遇到的那些问题

初学STM32标准库时,我遇到过几个“代码和接线都对,但硬件死活没反应”的怪问题。排查后发现,它们大多不是逻辑错误,而是藏在硬件接触、配置细节里的坑。本文记录了其中几个典型案例和我的解决过程 1. 电路导通异常 明明代码和电路…

📅 2026/9/4 4:13:26
MORE NEWS

更多资讯

📰

YOLOv9绝缘子缺陷检测实战:1580张实拍图+93.5% mAP

简介:本资源是一套面向电力巡检与智能视觉算法研发人员的绝缘子缺陷检测专用数据集,聚焦输电线路运维中破壳、闪络损坏外壳、正常外壳及绝缘子串四类关键状态识别任务,模型实测准确率达93.5%,可直接用于YOLOv9目标检测模型的训练与…

📰

3步搞定在床里打扑克又疼又叫时间长源码实战项目

3步搞定在床里打扑克又疼又叫时间长源码实战项目 官方文档动辄几百页,翻开就困,抓不住重点?别慌。在床里打扑克又疼又叫时间长这个看似荒诞的关键词,其实对应着高并发场景下的资源锁死与长耗时任务处理。很多开发者在实战项目中遇到类似“卡死”、“响应…

📰

MySQL 8.0.45 MGR单主模式高可用集群搭建与故障切换实战

干这一行久了就明白,MySQL高可用方案选来选去,最后还是会绕回官方那套东西。MGR(MySQL Group Replication)从5.7时代推到现在,8.0里已经非常稳定,很多生产环境都在用。今天就把我在Ubuntu 22.04上搭建MySQL…

📰

手机端网站面试题图解:搞定响应式布局与性能优化

手机端网站面试题图解:搞定响应式布局与性能优化 配置环境就卡半天,CSS 写了一堆 media query 还是乱码?别急,这行代码能救你。很多新人一上来就堆代码,结果在真机上调试时,发现图片变形、文字溢出、点击无反应。其实,手机端网站的核…

📰

从百度硬盘搜索到Everything:本地索引工具进化与文件管理之道

如果你经历过2006到2008年那阵子,大概还记得硬盘里塞满各种文档、电影、MP3、安装包的日子。那时候Windows自带的搜索慢得让人抓狂,动辄要“搜索中”等上几分钟,最后还可能给你返回一堆乱七八糟的结果。就在这个节骨眼上,百度硬盘…

📰

「请3休13」长假远程挂机谁更靠谱?实测ToDesk、向日葵、RustDesk远程稳定性、断线重连、远程终端

前言五一、国庆这种长假,数字爱好者最纠结的不是去哪玩,而是家里那台电脑怎么安排。游戏挂着自动刷材料、下载任务挂着跑满带宽、AI模型跑个几天几夜——这些场景有个共同点:人不在电脑前,但电脑不能停。远控软件在这个场景里解决…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬