如何实现一个KNN算法

Willow ·
更新时间:2024-11-01
· 994 次阅读

教你如何自己实现KNN算法

KNN算法,也称为K邻近算法,可以解决回归和分类问题,但解决分类问题才是它的优势。

KNN算法的本质就是寻找与我们提供的数据相似的k个样本,然后判断这k个样本的标签,最后统计每个标签出现的次数,次数最多的标签,就会被当作我们提供的数据的标签。

先说说工作流程:

机器学习是基于数据的,所以要先将实物转换为向量、矩阵或张量的形式 通过欧式距离计算出测试样本与其他样本之间的距离 将距离按照小到大排序,并取前K个值 判断前K个值相应的标签,并进行统计 统计最多的标签即为预测结果

现在我们来动手实现一下

先导入所有需要导入的库或模块

# 导入sklearn自带的数据集 from sklearn import datasets # 导入计数器,用于统计标签出现的次数 from collections import Counter # 用于分割数据集 from sklearn.model_selection import train_test_split # 用于计算欧式距离 import numpy as np

其次,导入iris数据集,存储样本特征和标签

data = datasets.load_iris() # 将样本特征存储到X X = data['data'] # 将样本标签存储到Y Y = data['target']

然后为了后期评估模型,这里将数据集分为训练集和测试集

X_train,X_test,Y_train,Y_test = train_test_split(X,Y,random_state=2000)

设置random_state为固定值,这样每次的运行结果就会一样,帮助我们判断过程出现的bug

再次,写一个计算距离的函数eus_dis

def eus_dis(instance1, instance2): '''计算两个样本之间的距离 instance1:array型 instance2:array型 ''' distance = np.sqrt(sum((instance1-instance2)**2)) return distance

接着,真正的开始实现KNN算法

def KnnClassify(X,Y,test,k): '''实现KNN算法 X:特征训练集-->array型 Y:标签训练集-->array型 test:特征测试集-->array型 k:邻近值-->int ''' # 计算样本之间的距离 distances = [eus_dis(x, test) for x in X] # 按照从小到大排序,并取前K个值,返回下标 kneighbors = np.argsort(distances)[:k] # 统计每个标签出现的次数 count = Counter(Y[kneighbors]) # 返回出现次数最多的标签 return count.most_common()[0][0]

最后我们来进行测试,观察其准确率

# 存储模型对特征测试集的预测结果 predirect = [KnnClassify(X_train,Y_train,test,5) for test in X_test] # 计算预测结果与实际结果相等的个数 count = np.count_nonzero((predirect==Y_test)==True) print("该模型的预测准确率为:%.3f" % (count/len(X_test)))

输出结果:该模型的预测准确率为:0.921

结果还算是比较准确,圆满收工,你学会了吗?

LuLiangJun001 原创文章 8获赞 0访问量 203 关注 私信 展开阅读全文
作者:LuLiangJun001



KNN算法 knn

需要 登录 后方可回复, 如果你还没有账号请 注册新账号