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的Lambda函数与排序
Oct 25 Python
Python变量和字符串详解
Apr 29 Python
20个常用Python运维库和模块
Feb 12 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
解决Mac下首次安装pycharm无project interpreter的问题
Oct 29 Python
详解Python Matplot中文显示完美解决方案
Mar 07 Python
selenium跳过webdriver检测并模拟登录淘宝
Jun 12 Python
Flask框架请求钩子与request请求对象用法实例分析
Nov 07 Python
Anaconda详细安装步骤图文教程
Nov 12 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 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 数组和字符串互相转换实现方法
2013/03/26 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
Javascript this指针
2009/07/30 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
再谈javascript注入 黑客必备!
2016/09/14 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
bootstrap手风琴折叠示例代码分享
2017/05/22 Javascript
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
2020/09/09 Javascript
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
Django项目之Elasticsearch搜索引擎的实例
2019/08/21 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
python字典的值可以修改吗
2020/06/29 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
教育课题研究自我鉴定范文
2013/12/28 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
怎样写好工作计划
2019/04/10 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
Java数组与堆栈相关知识总结
2021/06/29 Java/Android
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技