KNN算法
KNN算法
- 一 KNN算法介绍
- 二 KNN算法API
- 2.1 KNeighborsClassifier 分类算法
- 2.2 KNeighborsRegressor 回归算法
- 三 两个经典案例
- 3.1 鸢尾花案例
- 3.2 手写数字识别案例
一 KNN算法介绍
K-近邻算法(K Nearest Neighbor,简称KNN).比如根据你的“邻居”来推断出你的类别.
KNN算法思想:如果一个样本在特征空间中的 k 个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别 .
KNN算法的应用方式:
-
分类问题处理:
1.计算未知样本到每一个训练样本的距离
2.将训练样本根据距离大小升序排列
3.取出距离最近的 K 个训练样本
4.进行多数表决,统计 K 个样本中哪个类别的样本个数最多
5.将未知的样本归属到出现次数最多的类别
-
回归问题处理:
1.计算未知样本到每一个训练样本的距离
2.将训练样本根据距离大小升序排列
3.取出距离最近的 K 个训练样本
4.把这个 K 个样本的目标值计算其平均值
5.平均值作为未知的样本预测值
二 KNN算法API
# 导包
from sklearn.neighbors import KNeighborsClassifier,KNeighborsRegressor # 分类算法,回归算法
2.1 KNeighborsClassifier 分类算法
英文翻译:KNeighborsClassifier # 分类算法 estimator # 估量值 估计器例句:estimator = KNeighborsClassifier(n_neighbors=3) API解释:KNeighborsClassifier() # 创建分类算法对象n_neighbors=n # 参数 k 的值 即几个样本(邻居)应用场景:标签不连续通过分类思想解决.
2.2 KNeighborsRegressor 回归算法
英文翻译:KNeighborsRegressor # 回归算法 estimator # 估量值 估计器例句:estimator = KNeighborsRegressor(n_neighbors=4)API解释:KNeighborsRegressor() # 创建回归算法对象n_neighbors=n # 参数 k 的值 即几个样本(邻居)应用场景:标签连续通过回归思想解决.
三 两个经典案例
3.1 鸢尾花案例
本案例通过提取鸢尾花的特征,通过数据集训练模型使其可以分辨不同种类的鸢尾花.在Anaconda2024版本中已经集成了鸢尾花的数据集.方便大家直接使用.
# 0. 导包
from sklearn.datasets import load_iris # 加载鸢尾花数据集
import seaborn as sns # Seaborn绘图
import matplotlib.pyplot as plt # matplotlib
import pandas as pd # pandas
from sklearn.model_selection import train_test_split # 切割训练集和测试集
from sklearn.preprocessing import StandardScaler # 数据标准化处理
from sklearn.neighbors import KNeighborsClassifier # KNN算法 分类对象
from sklearn.metrics import accuracy_score # 模型评估# 1.定义函数 用于加载鸢尾花数据集 并简单查看数据集各部分
def dm01_load_iris():# 1.1加载数据集iris_data = load_iris()# 1.2 打印数据集# print(iris_data)# 1.3 #打印所有的键 即属性名# dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])# print(iris_data.keys())# 1.4 查看数据集字段特征print(iris_data.data[:5])# 1.5 查看数据集的标签字段print(iris_data.target[:5])# 1.6 查看数据集的标签名# ['setosa' 'versicolor' 'virginica']print(iris_data.target_names)# 1.7 查看数据集的特征名# ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']print(iris_data.feature_names)# 1.8 查看数据集描述信息# print(iris_data.DESCR)# 1.9 查看数据集文件名# print(iris_data.filename)# 1.10 查看数据集 数据模型# print(iris_data.data_module)# 2.定义函数 用于通过 Seaborn散点图的方式 对鸢尾花数据集进行可视化
def dm02_show_iris():# 1.加载鸢尾花数据集iris_data = load_iris()# 2.封装成DF 对象 作为可视化展示的数据源iris_df = pd.DataFrame(iris_data.data,columns=iris_data.feature_names)# 3.给DF 对象新增1列 表示:标签iris_df['label'] = iris_data.targetprint(iris_df)# 4.可视化 散点图# x: x轴值, 这里是: 花瓣的长度, y: y轴值, 这里是: 花瓣的宽度, hue: 颜色(根据鸢尾花的标签来分组, 不同分组颜色不同), fit_reg=False, 不绘制拟合回归线.sns.lmplot(data=iris_df,x='petal length (cm)',y='petal width (cm)',hue='label',fit_reg=False)# 设置标题plt.title('iris data')# 绘图plt.show()if __name__ == '__main__':# dm01_load_iris()dm02_show_iris()
# 3.定义函数实现划分训练集和测试集
def dm03_train_test_split():# 1.加载数据集iris_data = load_iris()# 2. 划分训练集和测试集# iris_data.data => 特征, 一共150条# iris_target => 标签, 一共150条# test_size => 测试集占比, 0.2 => 训练集 : 测试集 => 8 : 2# random_state => 随机种子, 如果种子一样, 则每次划分的数据集都是一样的.# 细节: 返回值的时候, 注意下四个参数的顺序, 即: 训练集特征, 测试集特征, 训练集标签, 测试集标签.x_train,x_test,y_train,y_test = train_test_split(iris_data.data,iris_data.target,test_size=0.2,random_state=66)# 3.打印划分后的结果print(f'训练集,x-特征:{len(x_train)}')print(f'测试集,x-特征:{len(x_test)}')print(f'训练集,y-标签:{len(y_train)}')print(f'测试集,y-标签:{len(y_test)}')# 4.定义函数 实现模型预测和评估
def dm04_predict():# 1.加载数据iris_data = load_iris()# 2.数据预处理 因数据量小且Anaconda2024提前处理过 这里只划分训练集与测试即可x_train, x_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2,random_state=66)# 3.特征工程# 3.1 特征提取:查看训练集的 特征, 因为特征是已经提取好的, 所以无需我们手动提取了, 即, 特征为: 花萼的长度, 花萼的宽度, 花瓣长度, 花瓣的宽度.# print(x_train)# 3.2 特征预处理# 创建标准化对象transfer = StandardScaler()# 标准化训练集的特征x_train = transfer.fit_transform(x_train)# 查看结果# print(x_train)# 标准化测试集的特征x_test = transfer.transform(x_test)# 4.模型训练(机器学习)# 4.1 创建估计器对象estimator = KNeighborsClassifier(n_neighbors=5)# 4.2 模型训练estimator.fit(x_train,y_train) # 传入 训练集的特征和标签# 5.模型预测# 场景1# 对测试集预测 得到预测后的测试集标签y_predict = estimator.predict(x_test)print(f'测试集预测结果为{y_predict}') # [1 0 0 0 1 1 0 2 0 0 1 1 2 2 0 2 1 1 0 2 2 1 2 1 0 1 0 0 1 2]# 场景2 对新数据集做预测# step1:定义新的数据集my_data = [[2.1, 3.5, 5.6, 3.2]]# step2:对新数据集标准化处理my_data = transfer.transform(my_data)# step3:对新数据集做结果分类预测,打印预测结果my_predict = estimator.predict(my_data)print(f'新数据集预测结果为{my_predict}') # 新数据集预测结果为[1]# step4:对新数据集做概率预测,看看在各个标签中的概率my_predict_proba = estimator.predict_proba(my_data)print(f'新数据集在各标签概率预测为{my_predict_proba}') # [[0. 0.6 0.4]] 即 占 0 1 2的概率# 6. 模型评估 KNN(K近邻算法), 评估指标主要是: 预测的准确率.# 方式1 直接评估 获取准确率print(f'直接评估准确率为{estimator.score(x_test,y_test)}') # 传入测试集特征和标签 # 0.9# 方式2 用真实值和预测值评估得到准确率print(f'真实值和预测值对比评估结果为{accuracy_score(y_test,y_predict)}') # 传入测试集标签和预测值标签 # 0.9if __name__ == '__main__':# dm03_train_test_split()dm04_predict()
3.2 手写数字识别案例
# 背景相关
MNIST手写数字识别
1999年发布,成为分类算法基准测试的基础
MNIST仍然是研究人员和学习者的可靠资源# 需求
从数万个手写图像的数据集中正确识别数字.
(超级经典的案例,数据集网络资源丰富,本文只手撕代码.)
# 导包
import matplotlib.pyplot as plt # matplotlib绘图
import pandas as pd # pandas
from sklearn.model_selection import train_test_split # 分割训练集和测试集
from sklearn.neighbors import KNeighborsClassifier # KNN 分类算法
import joblib # 加载或保存模型
from collections import Counter # 分组计数# 1. 定义函数用于查看数字图片
def show_digit(idx):"""定义函数用于查看数字图片:param idx: 行索引:return: 无"""# 1.读取数据 获取df对象data = pd.read_csv('data/手写数字识别.csv')# 细节: 非法值校验if idx < 0 or idx > len(data)-1:return# 2. 获取数据: 特征+标签x = data.iloc[:,1:] # 所有行,第二列到最后y = data.iloc[:,0] # 所有行,第一列# 3. 查看数据集print(f'x的维度{x.shape}') # (42000, 784)print(f'y的各分类数量{Counter(y)}') #Counter({1: 4684, 7: 4401, 3: 4351, 9: 4188, 2: 4177, 6: 4137, 0: 4132, 4: 4072, 8: 4063, 5: 3795})# 4.获取具体的某张图片 某一行数据等于一条样本数据# step1 把一条样本数据转成(28,28)的二维数组 即模拟28*28像素的图片digit = x.iloc[idx].values.reshape(28,28)# step2 显示图片plt.imshow(digit,cmap='gray') # cmap='gray' 灰色显示 即 灰度图# step3 取消坐标显示plt.axis('off')# step4 绘图plt.show() # 8# 在main函数中测试
if __name__ == '__main__':# 显示数字图片show_digit(10)
# 2.训练模型
def train_model():# 1.读取数据 获取df对象data = pd.read_csv('data/手写数字识别.csv')# 2.获取数据 特征+标签x = data.iloc[:,1:]y = data.iloc[:,0]# 3.特征预处理# step1 X轴(像素点)的归一化处理x = x / 255# step2 划分训练集和测试集# stratify=y 按照y的类别比例进行分割x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,stratify=y,random_state=66)# 4.训练模型estimator = KNeighborsClassifier(n_neighbors=3)estimator.fit(x_train,y_train)# 5.模型评估 评测正确率my_score = estimator.score(x_test,y_test)print(f'模型评估的正确率为{my_score}') # 0.9657142857142857# 6.保存模型joblib.dump(estimator,'model/knn.pth')# 3. 测试模型
def use_model():# 1.加载图片img = plt.imread('data/demo.png') # 28 * 28像素plt.imshow(img,cmap='gray') # 灰度图plt.show() # 2
# 2.加载模型estimator = joblib.load('model/knn.pth')# 3.预测图片img = img.reshape(1,-1) # 1行 所有列 等同于 (1, 784)y_test = estimator.predict(img)print(f'预测的数字是{y_test}') # [2]# 在main函数中测试
if __name__ == '__main__':# 训练模型# train_model() # 0.9657142857142857# 测试模型use_model()
以上就是要和大分享的KNN算法相关内容,机器学习算法还有很多,后面我还会持续分享其他训练模型的算法.我们下期见!
相关文章:

KNN算法
KNN算法 一 KNN算法介绍二 KNN算法API2.1 KNeighborsClassifier 分类算法2.2 KNeighborsRegressor 回归算法 三 两个经典案例3.1 鸢尾花案例3.2 手写数字识别案例 一 KNN算法介绍 K-近邻算法(K Nearest Neighbor,简称KNN).比如根据你的“邻居…...
TS 中类型的继承
在 TypeScript(TS)中,类型的继承通常通过接口(Interfaces)和类(Classes)来实现。接口提供了一种定义对象形状的方式,而类则提供了一种创建对象实例的方式。以下是如何在 TypeScript …...

在VS code 中部署C#和avalonia开发环境
要在 Mac 的 VS Code 中配置 C# 和 Avalonia 的开发环境,您可以按照以下步骤进行: 1. 安装 .NET SDK 下载 .NET SDK: 访问 .NET 下载页面。选择适用于 macOS 的最新稳定版本的 .NET SDK,并下载安装程序。安装 .NET SDK࿱…...
Windows删除service服务
Windows删除service服务 找到命令提示符: 右键,以管理员身份运行 输入: sc delete 服务名 Windows根据TCP端口号查找进程PID再kill进程_windows tcpkill-CSDN博客文章浏览阅读5.3k次,点赞42次,收藏104次。Windows根据…...

【数据结构】---图
图 前言 本篇作为图的基础概念篇, 了解图的离散数学定义, 图的分类, 图模型解决的问题(图的应用), 图的相关算法(仅仅介绍,具体不在此篇展开)。 学习基本路线ÿ…...

《 C++ 修炼全景指南:十四 》大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性能!
本篇博客深入探讨了 C 中的两种重要数据结构——BitSet 和 BloomFilter。我们首先介绍了它们的基本概念和使用场景,然后详细分析了它们的实现方法,包括高效接口设计和性能优化策略。接着,我们通过对比这两种数据结构的性能,探讨了…...

相机基础概念
景深: 景深的定义 DOF:depth of filed 是指在摄影机镜头或其他成像器前沿能够取得清晰图像的成像所测定的被摄物体前后距离范围。光圈、镜头、及焦平面到拍摄物的距离是影响景深的重要因素。定义3:在镜头前方(焦点的前、后)有一…...

【python】追加写入excel
输出文件运行前(有两张表,“表1”和“Sheet1”): 目录 一:写入单表(删除所有旧工作表,写入新表)二:写入多表(删除所有旧工作表,写入新表&#x…...
继承实现单例模式的探索(二)
前言 本篇文章继续探索通过继承实现单例模式的可行方案,这次的方案将采用反射机制隐式创建派生类实例,示例代码为C#。 代码 v1.0 using System.Reflection;/// <summary> /// 单例模式基类 /// </summary> /// <typeparam name"T&…...

设计模式-访问者模式
访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作,使得在不改变个元素的类的前提下定义作用于这些元素的新操作。...
国创——基于Unity3D和MediaPipe构建虚拟人物驱动系统
以下是一个基于Unity3D和MediaPipe构建虚拟人物驱动系统的基本概念和简化的Python示例代码框架。请注意,这只是一个基础示例,实际应用中可能需要更多的完善和调整。 一、整体概念 1. MediaPipe - MediaPipe是一个用于构建多模态(例如视频、…...

环境可靠性
一、基础知识 1.1 可靠性定义 可靠性是指产品在规定的条件下、在规定的时间内完成规定的功能的能力。 可靠性的三大要素:耐久性、可维修性、设计可靠性 耐久性:指的是产品能够持续使用而不会故障的特性,或者说是产品的使用寿命。 可维修性&a…...

Chromium 设置页面打开系统代理源码分析c++
1、前端页面调用showProxySettings() {chrome.send("showProxySettings")} 2、c 响应代码如下 chrome\browser\ui\webui\settings\system_handler.ccvoid SystemHandler::RegisterMessages() {web_ui()->RegisterMessageCallback("showProxySettings",b…...

信号检测理论(Signal Detection Theory, SDT)
信号检测理论(Signal Detection Theory, SDT)模拟是一种实验设计,用于研究和理解在存在噪声或不确定性的情况下如何做出决策。在心理学、认知科学、工程学和许多其他领域,信号检测理论都非常重要。 一、基础概念: 在信…...

Flink源码剖析
写在前面 最近一段时间都没有更新博客了,原因有点离谱,在实现flink的两阶段提交的时候,每次执行自定义的notifyCheckpointComplete时候,好像就会停止消费数据,完成notifyComplete后再消费数据;基于上述原因…...

[Python学习日记-39] 闭包是个什么东西?
[Python学习日记-39] 闭包是个什么东西? 简介 闭包现象 闭包意义与作用 简介 在前面讲函数和作用域的时候应该提到过,当函数运行结束后会由 Python 解释器自带的垃圾回收机制回收函数内作用域已经废弃掉的变量,但是在 Python 当中还有一种…...
XSLT 实例:掌握 XML 转换的艺术
XSLT 实例:掌握 XML 转换的艺术 引言 XSLT(可扩展样式表语言转换)是一种强大的工具,用于将 XML(可扩展标记语言)文档转换为其他格式,如 HTML、PDF 或纯文本。在本文中,我们将通过一…...

【C++】第一节:C++入门
1、C关键字 2、命名空间 在C/C中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染&am…...
CSP-S 2021 T1廊桥分配
CSP-S 2021 T1廊桥分配 枚举分配给国内航班和国外航班的廊桥数量,若分配给国内机场 i i i个廊桥,则国外机场就有 n − i n-i n−i个廊桥,在此基础上分别判断两边各能通过多少飞机。用一个小根堆存储飞机离开的时间,枚举到一个飞机…...

项目配置说明
文章目录 一、下载 vscode 并安装相应扩展1.1 下载 vscode1.2 安装扩展 二、git 项目三、git 提交流程3.1 确定要提交的代码 四、git 拉新流程 一、下载 vscode 并安装相应扩展 1.1 下载 vscode vscode 我已经发群里了,或者自己去官网下载也行 1.2 安装扩展 打开…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...