K近邻算法实现红酒数据集分类

news/2025/2/14 3:21:29/

目录

  • 1. 作者介绍
  • 2. K近邻算法介绍
    • 2.1 K基本原理
    • 2.2 算法优缺点
  • 3. KNN红酒数据集分类实验
    • 3.1 获取红酒数据集
    • 3.2 KNN算法
    • 3.3 完整代码
  • 4. 问题分析
  • 参考链接(可供参考的链接和引用文献)

1. 作者介绍

路治东,男,西安工程大学电子信息学院,2022级研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:206307079527@qq.com

2. K近邻算法介绍

2.1 K基本原理

原理:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,那么该样本也属于这个类别。简单来说就是,求两点之间的距离,看距离谁是最近的,以此来区分我们要预测的这个数据是属于哪个分类。

我们看图来理解一下。蓝色点是属于a类型的样本点,粉色点是属于b类型的样本点。此时新来了一个点(黄色点),怎么判断是属于它是a类型还是b类型呢。

方法是:新点找距离自身最近的k个点(k可变)。分别计算新点到其他各个点的距离,按距离从小到大排序,找出距离自身最近的k个点。统计在这k个点中,有多少点属于a类,有多少点属于b类。在这k个点中,如果属于b类的点更多,那么这个新点也属于b分类。距离计算公式也是我们熟悉的勾股定理。
在这里插入图片描述

2.2 算法优缺点

算法优点:简单易理解、无需估计参数、无需训练。适用于几千-几万的数据量。

算法缺点:对测试样本计算时的计算量大,内存开销大,k值要不断地调整来达到最优效果。k值取太小容易受到异常点的影响,k值取太多产生过拟合,影响准确性。

3. KNN红酒数据集分类实验

3.1 获取红酒数据集

首先导入sklearn的本地数据集库,变量wine获取红酒数据,由于wine接收的返回值是.Bunch类型的数据,因此我用wine_data接收所有特征值数据,它是178行13列的数组,每一列代表一种特征。wine_target用来接收所有的目标值,本数据集中的目标值(红酒类别)为0、1、2三类红酒。

然后把我们需要的数据转换成DataFrame类型的数据。为了使预测更具有一般性,我们把这个数据集打乱。操作如下:

from sklearn import datasets
wine = datasets.load_wine()  # 获取葡萄酒数据
wine_data = wine.data  #获取葡萄酒的索引data数据,178行13列
wine_target = wine.target  #获取分类目标值# 将数据转换成DataFrame类型
wine_data = pd.DataFrame(data = wine_data)
wine_target = pd.DataFrame(data = wine_target)# 将wine_target插入到第一列,并给这一列的列索引取名为'class'
wine_data.insert(0,'class',wine_target)# ==1== 变量.sample(frac=1)           表示洗牌,重新排序
# ==2== 变量.reset_index(drop=True)   使index从0开始排序wine = wine_data.sample(frac=1).reset_index(drop=True)  #把DataFrame的行顺序打乱

3.2 KNN算法

一般采用75%的数据用于训练,25%用于测试,因此在数据进行预测之前,先要对数据划分。

划分方式:
使用sklearn.model_selection.train_test_split 模块进行数据分割。

x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=数据占比)
train_test_split() 括号内的参数:
x:数据集特征值(features)
y:数据集目标值(targets)
test_size: 测试数据占比,用小数表示,如0.25表示,75%训练train,25%测试test。train_test_split() 的返回值:
x_train:训练部分特征值
x_test:    测试部分特征值
y_train:训练部分目标值
y_test:    测试部分目标值
# 划分测试集和训练集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(features,targets,test_size=0.25)

3.3 完整代码

import pandas as pd
from sklearn import datasetswine = datasets.load_wine()  # 获取葡萄酒数据
wine_data = wine.data  #获取葡萄酒的索引data数据,178行13列
wine_target = wine.target  #获取分类目标值wine_data = pd.DataFrame(data = wine_data)  #转换成DataFrame类型数据
wine_target = pd.DataFrame(data = wine_target)
# 将target插入到第一列
wine_data.insert(0,'class',wine_target)# ==1== 变量.sample(frac=1)           表示洗牌,重新排序
# ==2== 变量.reset_index(drop=True)   使index从0开始排序,可以省略这一步
wine = wine_data.sample(frac=1).reset_index(drop=True)# 拿10行出来作验证
wine_predict = wine[-10:].reset_index(drop=True)
wine_predict_feature = wine_predict.drop('class',axis=1)  #用于验证的特征值,输入到predict()函数中
wine_predict_target = wine_predict['class']  #目标值,用于和最终预测结果比较wine = wine[:-10]  #删除后10行
features = wine.drop(columns=['class'],axis=1)  #删除class这一列,产生返回值,这个是特征值
targets = wine['class']  #class这一列就是目标值
# 相当于13个特征值对应1个目标# 划分测试集和训练集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(features,targets,test_size=0.25)# 先标准化再预测
from sklearn.preprocessing import StandardScaler  #导入标准化缩放方法
scaler = StandardScaler()  #变量scaler接收标准化方法# 传入特征值进行标准化
x_train = scaler.fit_transform(x_train)  #对训练的特征值标准化
x_test = scaler.fit_transform(x_test)    #对测试的特征值标准化
wine_predict_feature = scaler.fit_transform(wine_predict_feature)# 使用K近邻算法分类
from sklearn.neighbors import KNeighborsClassifier  #导入k近邻算法库
# k近邻函数
knn = KNeighborsClassifier(n_neighbors=5,algorithm='auto')# 训练,把训练的特征值和训练的目标值传进去
knn.fit(x_train,y_train)
# 检测模型正确率--传入测试的特征值和目标值
# 评分法,根据x_test预测结果,把结果和真实的y_test比较,计算准确率
accuracy = knn.score(x_test,y_test)
# 预测,输入预测用的x值
result = knn.predict(wine_predict_feature)

4. 问题分析

若遇到安装库不完整问题,见如下所图示的错误,可检测相关库是否安装或环境问在这里插入图片描述
在这里插入图片描述

参考链接(可供参考的链接和引用文献)

[1]K近邻算法:原理、实例应用]https://blog.csdn.net/dgvv4/article/details/121316823
[2]案例:红酒数据集分析]https://blog.csdn.net/qq_42374697/article/details/108073110


http://www.ppmy.cn/news/78879.html

相关文章

真香,聊聊 RocketMQ 5.0 的 POP 消费模式!

大家好,我是君哥。 大家都知道,RocketMQ 消费模式有 PULL 模式和 PUSH 模式,不过本质上都是 PULL 模式,而在实际使用时,一般使用 PUSH 模式。 不过,RocketMQ 的 PUSH 模式有明显的不足,主要体…

Autosar RTE S/R接口implicit与Explicit的实现与区别

文章目录 前言接口的代码implicitIReadIWrite ExplicitReadWrite 区别与使用场景总结 前言 Autosar官方文档阅读起来比较费劲,一般从实际应用中来了解更多规范中的内容。本文介绍最常用的RTE S/R接口的implicit隐式与Explicit显式两种方式的实现与差别 接口的代码…

单视觉L2市场「鲶鱼」来了,掀起数据反哺高阶新打法

作者 | 张祥威编辑 | 德新 智驾方案的降本行动仍在推进。 早年,单视觉L2市场的玩家以Mobileye、博世为主,后来国内智驾公司加入,共同推动 1V、1R1V、nR1V等不同的方案兴起,L2近乎成为车辆的必备功能。 当下,在行业降低…

non-protected broadcast场景分析及解决

non-protected broadcast场景分析及解决 在两个app之间互相送消息使用BroadcastReceiver,有时在运行过程中在logcat工具中会发现大片的飘红消息。 要消除这些错误信息,需要在广播的 Sender 和 Receiver 做部分的修改。 错误信息分析 由于 发送端 的 M…

基于单片机的家用应急电源设计

摘要 本设计基于STC89C52单片机设计得应急电源,以应急电源为研究对象,单片机设计为控制集成IC,ADC为模数转换控制模块,无源蜂鸣器作为报警电路。系统分为单片机设计最小系统,AD转换控制模块,电源电路&#…

PythonOCR识别扫描版纯图PDF提取汉字的10大方法,力推RapidOCRPDF 可识别纯图PDF 加密签名的PDF 重点是开源免费,某些方面准确度比百度OCR高

下面实例都以下面的测试样例PDF为实验对象 非纯图可复制pdf 纯图PDF TOP1:RapidOCRPDF 可识别纯图PDF也能识别加密签名的PDF 重点是开源免费 https://github.com/RapidAI/RapidOCRPDF # 基于rapidocr_onnxruntime pip install rapidocr_pdf[onnxruntime]# 基于ra…

跟我学c++高级篇——反射的基本实现方式

一、c中的反射基本实现 综合反射在各种高级语言中的应用以及前面分析过的反射的原理,就可以明白,一种概念或者说技术在某种语言中是否拥有,更准确的其实是说是否原生拥有。毕竟,没有可以通过某种技术或者手段模拟出来&#xff0c…

IEEE模板使用注意事项

关于单栏双栏 注意区分用的模板是 {IEEEtran} 还是期刊自己的如 {IEEEtaes} 如果是后者,可能不支持通过直接在文档开头加一行代码直接转单栏。 关于公式 When referring to an equation or formula, use simply “(1),” not “Eq. (1)” or “equation (1),” e…