失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python实现KNN分类算法(鸢尾花数据集)

python实现KNN分类算法(鸢尾花数据集)

时间:2023-06-29 23:26:20

相关推荐

python实现KNN分类算法(鸢尾花数据集)

一、题目

原生python实现KNN分类算法(鸢尾花数据集)

数据来源:/s/1xPYOuHLdQj-gOaNfbupCAw

二、算法设计

kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

1、总体设计

2、KNN分类设计

三、代码实现

import numpy as npimport pandas as pdclass KNN:"""使用python实现K近邻算法"""def __init__(self,k):"""初始化方法Parameters:----k:int邻居的个数"""self.k = kdef fit(self, X, y):"""训练方法Parameters----X:类似数组类型,list,ndarray……形状:[样本的数量,特征的数量]y:类似数组类型,形状为[样本数量]每个样本的目标值,也是就是标签"""#将X转换成ndarray类型,如果X已经是ndarray则不进行转换self.X = np.asarray(X)self.y = np.asarray(y)def predict(self, X):"""根据参数传递的样本,对样本数据进行预测,返回预测之后的结果Parameters----X:类似数组类型 形状:[样本的数量,特征的数量] Return----result:数组类型,预测的结果。"""#将测试的X转换为ndarray结构X = np.asarray(X)result = [] for x in X:#ndarray相减为对应元素相减,测试的X的每一行与self.X 相减#求欧氏距离:每个元素都取平方值dis = np.sqrt(np.sum((x - self.X) ** 2,axis = 1))#argsort(),返回每个元素在排序之前原数组的索引index = dis.argsort()#取前k个元素,距离最近的k的元素index = index[:self.k]#返回数组中每个元素出现的次数,元素必须是非负整数count = np.bincount(self.y[index])#返回ndarray之最大的元素的索引,该索引就是我们判定的类别result.append(count.argmax())return np.asarray(result)#读取数据集,header参数来指定参数标题的行,默认为0,第一行,如果没有标题使用Nonedata = pd.read_csv('iris.csv',header=0)#对文本进行处理,将Species列的文本映射成数值类型data['Species'] = data['Species'].map({'virginica':0,'setosa':1,'versicolor':2})#随机显示,默认为1条data.sample(10)#删除不需要的列data.drop("id",axis=1,inplace=True)#重复值检查,any(),一旦有重复值,就返回Truedata.duplicated().any()#删除重复的数据data.drop_duplicates(inplace=True)#查看各类别的数据条数#print(data['Species'].value_counts())#print(data)#数据集拆分成训练集和测试集#提取每个类别鸢尾花的数量t0 = data[data['Species']==0]t1 = data[data['Species']==1]t2 = data[data['Species']==2]#打乱顺序,random_state ,记住打乱的顺序t0 = t0.sample(len(t0),random_state=0)t1 = t1.sample(len(t1),random_state=0)t2 = t2.sample(len(t2),random_state=0)train_X = pd.concat([t0.iloc[:40,:-1],t1.iloc[:40,:-1],t2.iloc[:40,:-1]],axis=0)train_Y = pd.concat([t0.iloc[:40,-1],t1.iloc[:40,-1],t2.iloc[:40,-1]],axis=0)test_X = pd.concat([t0.iloc[40:,:-1],t1.iloc[40:,:-1],t2.iloc[40:,:-1]],axis=0)test_Y = pd.concat([t0.iloc[40:,-1],t1.iloc[40:,-1],t2.iloc[40:,-1]],axis=0)#print(train_X.shape)#print(train_Y.shape)#print(test_X.shape)#print(test_Y.shape)#进行训练与测试knn = KNN(k=5)#进行训练knn.fit(train_X,train_Y)#进行测试result = knn.predict(test_X)#display(result)#display(test_Y)#查看预测结果#display(np.sum(result == test_Y))r=np.mean(result == test_Y)print("测试集的正确率:{:.2f}".format(r))

四、测试用例设计及调试过程测试:

1、对读取的鸢尾花数据测试

2、对训练集和测试集测试

3、对预测结果与测试集对比测试

调试:选取K近邻时的排序问题

求最近的k个点的距离,sort()排序不适用,因为排序后打乱了原有的顺序。

解决:使用argsort()返回每个元素在排序之前原数组的索引

五、总结

k-近邻方法思路简单,算法过程清晰,但是计算过程十分繁琐。因为对于每一个测试样本,都要对其与每一个训练样本求欧式距离,之后再进行排序,而排序的算法需要耗费大量时间,再取前k小个欧式距离的类别标签,得出预测标签。这样,对于一些维数高、样本个数多的数据集,k-近邻方法显然不是一种节约时间的方法,如果使用,还需要进一步的优化。

如果觉得《python实现KNN分类算法(鸢尾花数据集)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。