目录
一、算法概述
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之间的距离公式:
接下来,对这些距离进行排序,并取前k个距离对应的索引,即找出与当前测试样本距离最近的k个训练样本。使用argsort方法对距离数组dis进行排序,返回的是排序后的索引数组,然后取前k个索引,即找到了最近的k个训练


1万+

被折叠的 条评论
为什么被折叠?



