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 相关文章推荐
可用于监控 mysql Master Slave 状态的python代码
Feb 10 Python
python实现对一个完整url进行分割的方法
Apr 29 Python
Django卸载之后重新安装的方法
Mar 15 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
Python模块文件结构代码详解
Feb 03 Python
python删除本地夹里重复文件的方法
Nov 19 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
Python实现的特征提取操作示例
Dec 03 Python
python实现PID算法及测试的例子
Aug 08 Python
python之yield和Generator深入解析
Sep 18 Python
通过python扫描二维码/条形码并打印数据
Nov 14 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 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
星际争霸兵种名称对照表
2020/03/04 星际争霸
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
2014/05/12 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
Javascript表达式中连续的 && 和 || 之赋值区别
2010/10/17 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
jQuery实现动画效果circle实例
2015/08/06 Javascript
原生js实现数字字母混合验证码的简单实例
2015/12/10 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
Angularjs的ng-repeat中去除重复数据的方法
2016/08/05 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
security.js实现的RSA加密功能示例
2018/06/06 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
TensorFlow实现创建分类器
2018/02/06 Python
python防止随意修改类属性的实现方法
2019/08/21 Python
python 引用传递和值传递详解(实参,形参)
2020/06/05 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
初中开学典礼新闻稿
2015/07/17 职场文书
mysql查询的控制语句图文详解
2021/04/11 MySQL