前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何实现一个KNN算法

如何实现一个KNN算法

作者头像
佛系编程人
发布2020-05-07 10:20:44
3480
发布2020-05-07 10:20:44
举报
文章被收录于专栏:佛系编程人

教你如何自己实现KNN算法

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

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

先说说工作流程:

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

现在我们来动手实现一下

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

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

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

代码语言:javascript
复制
data = datasets.load_iris()# 将样本特征存储到XX = data['data']# 将样本标签存储到YY = data['target']

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

代码语言:javascript
复制
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,random_state=2000)

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

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

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

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

代码语言:javascript
复制
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]

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

代码语言:javascript
复制
# 存储模型对特征测试集的预测结果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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 佛系编程人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档