Python实现KNN(K-近邻)算法的示例代码


Posted in Python onMarch 05, 2019

一、概述

KNN(K-最近邻)算法是相对比较简单的机器学习算法之一,它主要用于对事物进行分类。用比较官方的话来说就是:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例, 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。为了更好地理解,通过一个简单的例子说明。

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

Python实现KNN(K-近邻)算法的示例代码

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

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

Python实现KNN(K-近邻)算法的示例代码

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

二、算法介绍

还是以上面的数据为例,打戏数为 x,吻戏数为 y,通过欧式距离公式计算测试数据到训练数据的距离,我上中学那会儿不知道这个叫做欧式距离公式,一直用”两点间的距离公式“来称呼这个公式: Python实现KNN(K-近邻)算法的示例代码 。但是现实中的很多数据都是多维的,即使如此,也还是按照这个思路进行计算,比如如果是三维的话,就在根号里面再加上 z 轴差的平方,即  Python实现KNN(K-近邻)算法的示例代码 ,以此类推。

知道了这个计算公式,就可以计算各个距离了。我们以到最上面的点的距离为例: Python实现KNN(K-近邻)算法的示例代码 ,那么从上到下的距离分别是: Python实现KNN(K-近邻)算法的示例代码Python实现KNN(K-近邻)算法的示例代码Python实现KNN(K-近邻)算法的示例代码Python实现KNN(K-近邻)算法的示例代码 。现在我们把 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 ** 2
  sqrDiffSum = 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%,可以通过增加修改数据测试,如果有大量多维的数据就更好了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用python爬取斗鱼app中照片方法实例
Dec 03 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
Mar 14 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
Aug 07 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
Oct 09 Python
python图像处理入门(一)
Apr 04 Python
对DJango视图(views)和模版(templates)的使用详解
Jul 17 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
Pandas数据离散化原理及实例解析
Nov 16 Python
python实现画循环圆
Nov 23 Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 Python
解决python3安装pandas出错的问题
May 20 Python
Python按钮的响应事件详解
Mar 04 #Python
Python中三元表达式的几种写法介绍
Mar 04 #Python
Python生成器的使用方法和示例代码
Mar 04 #Python
Python去除字符串前后空格的几种方法
Mar 04 #Python
python调用外部程序的实操步骤
Mar 04 #Python
Python实现的合并两个有序数组算法示例
Mar 04 #Python
python创造虚拟环境方法总结
Mar 04 #Python
You might like
一个目录遍历函数
2006/10/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
JQuery上传插件Uploadify使用详解及错误处理
2010/04/27 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
JS中type="button"和type="submit"的区别
2017/07/04 Javascript
jquery自定义显示消息数量
2017/12/19 jQuery
JS计算距当前时间的时间差实例
2017/12/29 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
webpack4 SplitChunks实现代码分隔详解
2019/05/23 Javascript
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
Python常用列表数据结构小结
2014/08/06 Python
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
Django 批量插入数据的实现方法
2020/01/12 Python
python help函数实例用法
2020/12/06 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
css3如何绘制一个圆圆的loading转圈动画
2018/01/09 HTML / CSS
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
安全生产演讲稿
2014/05/09 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
烈士陵园扫墓感想
2015/08/07 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL