【机器学习】KNN实现鸢尾花分类

目录

一、算法概述

1.1 算法介绍

1.2 KNN算法的一般流程

1.3 KNN算法的伪代码

二、算法实现(鸢尾花分类)

2.1数据加载和预处理

2.2 KNN算法实现

 2.2.1 计算样本间的距离

 2.2.2 关于Self@KNN

2.3样本划分

2.4训练与测试模型

2.5性能评估

2.6 结果可视化

2.7 整体代码展示

三、实验结果分析

3.1实验中出现的问题

3.2实验结果显示

3.3实验总结

3.4参考书籍


一、算法概述
1.1 算法介绍

 K-近邻算法又叫做KNN算法,是机器学习算法中最基础入门的算法。KNN算法是最简单的分类算法之一,同时,它也是最常用的分类算法之一。

KNN算法基于实例之间的相似性进行分类或回归预测。在KNN算法中,要解决的问题是将新的数据点分配给已知类别中的某一类。该算法的核心思想是通过比较距离来确定最近邻的数据点,然后利用这些邻居的类别信息来决定待分类数据点的类别,简单来说,KNN采用测量不同特征值之间的距离方法进行分类。其核心思想为:“近朱者赤近墨者黑”。

1.2 KNN算法的一般流程

(1)收集数据

(2)准备数据:距离计算所需要的数值,最好是结构化的数据格式

(3)分析数据

(4)测试算法:计算错误率

(5)使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

1.3 KNN算法的伪代码

对未知类别属性的数据集中的每个点依次执行以下操作:

(1)计算已知类别数据集中的点与当前点之间的距离;

(2)按照距离递增次序排序;

(3)选取与当前点距离最小的k个点;

(4)确定前k个点所在类别的出现频率;

(5)返回前k个点出现频率最高的类别作为当前点的预测分类。

二、算法实现(鸢尾花分类)
2.1数据加载和预处理

首先,代码使用`pandas`库加载了一个名为`iris.arff.csv`的数据集,并对其进行一些预处理。

`iris.arff.csv`数据集具体内容如下图所示:

预处理包括将鸢尾花的三个类别(Iris-virginica,Iris-setosa和Iris-versicolor)映射为数字0、1和2,以便进行后续的分类。然后检查是否存在重复数据并移除,确保数据的唯一性。

#读取数据集 header参数指定标题的行 默认0
data = pd.read_csv(r'D:\ywh_knn\dataset\iris.arff.csv',header=0)
#data.head() #头5行
#data.tail() #末5行
#随机抽取15个样本 可以指定参数
data.sample(15) 
# 删除不必要的id列
#data.drop("id",axis=1,inplace=True)
data["class"] = data["class"].map({"Iris-virginica":0,"Iris-setosa":1,"Iris-versicolor":2}) # 将特征class(类别名称)映射为数字
# 观察是否有重复值
data.duplicated().any() #结果为true说明,有重复列
# 查看原始数据集记录数目
print(len(data)) #150

# 删除重复记录  inplace=True在原有数据集上操作
data.drop_duplicates(inplace=True)
print(len(data)) #147
# 查看各个类别的鸢尾花具有多少条记录
data["class"].value_counts()
2.2 KNN算法实现

定义了一个名为`KNN`的类,用于实现K最近邻算法。在初始化函数`__init__`中,指定了K值。KNN算法的核心部分包括`fit`和`predict`方法。`fit`方法用于训练模型,接收训练数据集X和对应的标签y,并将其转换为 NumPy 数组,并保存在self.X和self.y中。。`predict`方法用于对新样本进行预测,接收测试数据集X,并返回预测结果。

 2.2.1 计算样本间的距离

在predict方法中,对于每个测试样本x,首先计算它与所有样本之间的距离,这里通过numpy,将测试样本x与所有训练样本self.X逐元素相减,然后对差值的平方求和,再对和值开方,得到了每个测试样本与所有训练样本之间的欧式距离。

用欧式距离计算两个向量点xA和xB之间的距离公式:

d = \sqrt{(xA_{0}-xB_{0})^{2}+(xA_{1}-xB_{1})^{2}}

接下来,对这些距离进行排序,并取前k个距离对应的索引,即找出与当前测试样本距离最近的k个训练样本。使用argsort方法对距离数组dis进行排序,返回的是排序后的索引数组,然后取前k个索引,即找到了最近的k个训练

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值