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处理中文编码和判断编码示例
Feb 26 Python
Python操作CouchDB数据库简单示例
Mar 10 Python
Python实现matplotlib显示中文的方法详解
Feb 06 Python
Python中max函数用于二维列表的实例
Apr 03 Python
对python中array.sum(axis=?)的用法介绍
Jun 28 Python
Python2与Python3的区别实例总结
Apr 17 Python
Django框架会话技术实例分析【Cookie与Session】
May 24 Python
python实现月食效果实例代码
Jun 18 Python
Pycharm配置lua编译环境过程图解
Nov 28 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
Dec 05 Python
Python实现socket库网络通信套接字
Jun 04 Python
django 认证类配置实现
Nov 11 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
PHP使用feof()函数读文件的方法
2014/11/07 PHP
php获取图片信息的方法详解
2015/12/10 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
2015/12/14 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
vee-validate vue 2.0自定义表单验证的实例
2018/08/28 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
Python和Perl绘制中国北京跑步地图的方法
2016/03/03 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
Django中Model的使用方法教程
2018/03/07 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
解决Opencv+Python cv2.imshow闪退问题
2020/04/24 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
日语专业个人求职信范文
2014/02/02 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
2014年质检工作总结
2014/11/26 职场文书
向女朋友道歉的话
2015/01/20 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
七年级作文之我的梦想
2019/10/16 职场文书
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android