一、概述

KNN(K-最近邻)算法是相对比较简单的机器学习算法之一,它主要用于对事物进行分类。

用比较官方的话来说就是:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例, 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。为了更好地理解,通过一个简单的例子说明。

现在我们有一组自拟的关于电影中镜头的数据:

那么问题来了,如果有一部电影 X,它的打戏为 3,吻戏为 2。那么这部电影应该属于哪一类?

我们把所有数据通过图表显示出来(圆点代表的是自拟的数据,也称训练集;三角形代表的是 X 电影的数据,称为测试数据):


计算测试数据到训练数据之间的距离,假设 k 为 3,那么我们就找到距离中最小的三个点,假如 3 个点中有 2 个属于动作片,1 个属于爱情片,那么把该电影 X 分类为动作片。这种通过计算距离总结 k 个最邻近的类,按照”少数服从多数“原则分类的算法就为 KNN(K-近邻)算法。

二、算法介绍

还是以上面的数据为例,打戏数为 x,吻戏数为 y,通过欧式距离公式计算测试数据到训练数据的距离,我上中学那会儿不知道这个叫做欧式距离公式,一直用”两点间的距离公式“来称呼这个公式:

但是现实中的很多数据都是多维的,即使如此,也还是按照这个思路进行计算,比如如果是三维的话,就在根号里面再加上 z 轴差的平方,即

以此类推。

知道了这个计算公式,就可以计算各个距离了。我们以到最上面的点的距离为例:

那么从上到下的距离分别是:√13,√5,√5,√5。现在我们把 k 定为 3,那么距离最近的就是后面三个数了,在这三个数中,有两个属于动作片,因此,电影 X 就分类为动作片。

三、算法实现

知道了原理,那就可以用代码实现了,这里就不再赘述了,直接上带注释的 Python 代码:

'''trainData - 训练集testData - 测试集labels - 分类
'''
def knn(trainData, testData, labels, k):# 计算训练样本的行数rowSize = trainData.shape[0]# 计算训练样本和测试样本的差值diff = np.tile(testData, (rowSize, 1)) - trainData# 计算差值的平方和sqrDiff = diff ** 2sqrDiffSum = sqrDiff.sum(axis=1)# 计算距离distances = sqrDiffSum ** 0.5# 对所得的距离从低到高进行排序sortDistance = distances.argsort()count = {}for i in range(k):vote = labels[sortDistance[i]]count[vote] = count.get(vote, 0) + 1# 对类别出现的频数从高到低进行排序sortCount = sorted(count.items(), key=operator.itemgetter(1), reverse=True)# 返回出现频数最高的类别return sortCount[0][0]

ps:np.tile(testData, (rowSize, 1)) 是将 testData 这个数据扩展为 rowSize 列,这样能避免运算错误;

sorted(count.items(), key=operator.itemgetter(1), reverse=True) 排序函数,里面的参数 key=operator.itemgetter(1), reverse=True 表示按照 count 这个字典的值(value)从高到低排序,如果把 1 换成 0,则是按字典的键(key)从高到低排序。把 True 换成 False 则是从低到高排序。

四、测试与总结

用 Python 实现了算法之后,我们用上面的数据进行测试,看一下结果是否和我们预测的一样为动作片:

trainData = np.array([[5, 1], [4, 0], [1, 3], [0, 4]])
labels = ['动作片', '动作片', '爱情片', '爱情片']
testData = [3, 2]
X = knn(trainData, testData, labels, 3)
print(X)

执行这段代码后输出的结果为:动作片 。和预测的一样。当然通过这个算法分类的正确率不可能为 100%,可以通过增加修改数据测试,如果有大量多维的数据就更好了。

喜欢的动动小手点个赞,转载请注明出处:【大数据的奇妙冒险】

KNN(K-近邻)算法的原理与实现相关推荐

  1. 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍一下python机器学习中的K近邻算法.内容有:K近邻算法的原理解析:实战案例--红酒分类预测.红酒数据集.完整代码在文章最下面. 案例简介:有178个红酒样本,每一款红酒 ...

  2. knn K近邻算法python实现

    本文主要内容: knn K近邻算法原理 sklearn knn的使用,以及cross validation交叉验证 numpy 实现knn knn改进方法 1 knn K近邻算法原理 K近邻算法:给定 ...

  3. chapter2 机器学习之KNN(k-nearest neighbor algorithm)--K近邻算法从原理到实现

    一.引入 K近邻算法作为数据挖掘十大经典算法之一,其算法思想可谓是intuitive,就是从训练集里找离预测点最近的K个样本来预测分类 因为算法思想简单,你可以用很多方法实现它,这时效率就是我们需要慎 ...

  4. 【20210922】【机器/深度学习】KNN (K近邻) 算法详解

    一.算法概念 KNN, K-near neighbor,即最近邻算法.它是一种分类算法,算法思想是:一个样本与数据集中的 k 个样本最相似,如果这 k 个样本中的大多数属于某一个类别,则该样本也属于这 ...

  5. knn(k近邻算法)——matlab

    目录 1. 基本定义 2. 算法原理 2.1 算法优缺点 2.2 算法参数 2.3 变种 3.算法中的距离公式 4.案例实现 4.1 读取数据 4.2 分离训练集和测试集 4.3 归一化处理 4.4  ...

  6. KNN K近邻算法学习

    KNN算法.k-nearest neighbor,或者K-近邻算法是一种经典的机器学习算法,可以完成分类和回归任务. KNN算法主要思想: 对于输入的特征X,选取与他记录最近的K个点,统计这K个点所属 ...

  7. K近邻算法KNN的简述

    什么是KNN K近邻算法又称KNN,全称是K-Nearest Neighbors算法,它是数据挖掘和机器学习中常用的学习算法,也是机器学习中最简单的分类算法之一.KNN的使用范围很广泛,在样本量足够大 ...

  8. 【模式识别】实验二:K近邻算法(KNN)

    KNN是模式识别中的经典算法,本次实验就MNIST数据集来做KNN算法的实验,并结合前一次的LDA降维对数据进行进一步处理. 实验报告图片版 pdf版本可以戳这:模式识别实验报告:KNN K近邻算法 ...

  9. 01 K近邻算法 KNN

    01 K近邻算法 KNN k近邻算法基础 等价于 scikit-learn中的机器学习算法封装 训练数据集,测试数据集 分类准确度 超参数 考虑距离权重 更多关于距离的定义 搜索明可夫斯基距离相应的p ...

  10. 送你一份使用k近邻算法实现回归的实用指南(附代码、链接)

    作者:AISHWARYA SINGH, AUGUST 22, 2018 翻译:赵雪尧 校对:张玲 本文约4200字,建议阅读10分钟. 本文解释了在k近邻算法工作原理的基础上,简单介绍三种计算点距离方 ...

最新文章

  1. python中configparser_python中confIgparser模块学习
  2. 三、入门实例----基于注解
  3. oracle拼接字符串报错,Oracle 中wmsys.wm_concat拼接字符串,结果过长报错解决
  4. ruby array_Ruby中带有示例的Array.cycle()方法
  5. Navicat 12 连接oracle闪退问题
  6. PHP 在线 编辑 解析
  7. mescroll.js 上拉刷新 下拉加载
  8. 精忠报国用计算机弹,同人精忠报国岳飞传
  9. linux命令sm,Linux系统命令和使用技巧8则
  10. CF676A Nicholas and Permutation 题解
  11. dwf是什么格式文件
  12. justjavac:从辍学到成为Deno核心代码贡献者,我的十年编程生涯
  13. ios 拍照人像识别_Google相册为iOS用户添加了人像深度编辑和色彩弹出功能
  14. Hash一致性算法(分片机制)
  15. 全“芯”升级,浩辰CAD 2021赋能全国产化CAD应用
  16. sdlc 瀑布式 生命周期_SDLC指南–软件开发生命周期的阶段和方法
  17. 电气系统中防雷接地保护的综合解决方案
  18. python onenet_onenet简介
  19. 操作系统之经典 | 生产者与消费者问题
  20. 掌上智维隐私政策privacy

热门文章

  1. IP网络中的名字和地址
  2. Javaweb基础笔记1-SQL基础语句
  3. 业余选手常见的技术缺陷及解决办法(上)
  4. 申宝股票-盐湖提锂板块拉升
  5. UE4和C++创建自己的第一个UObject子类,以及如何在蓝图中去使用这个C++类
  6. xtrabackup备份与还原
  7. MEM/MBA 考研高频单词总结(08)
  8. 自定义view点击产生涟漪
  9. Android:RTSP流媒体花屏
  10. js两个数组对象获取相同和不同的元素对象(ES6)