一文搞懂K近邻算法(KNN),附带多个实现案例
简介:本文作者为 CSDN 博客作者董安勇,江苏泰州人,现就读于昆明理工大学电子与通信工程专业硕士,目前主要学习机器学习,深度学习以及大数据,主要使用python、Java编程语言。平时喜欢看书,打篮球,编程。学习为了进步,进步为了更好的学习!
一、KNN回顾
k 近邻学习是一种常用的监督学习方法,比如:判断一个人的人品,只需要观察与他来往最密切的几个人的人品好坏就可以得出,即“近朱者赤,近墨者黑”。
理论/原理:“物以类聚,人以群分”
相同/近似样本在样本空间中是比较接近的,所以可以使用和当前样本比较近的其他样本的目标属性值作为当前样本的预测值。
k 近邻法的工作机制很简单:
给定测试样本,基于某种距离度量(一般使用欧几里德距离)找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。
二、KNN三要素
1、K值的选择
对于K值的选择,一般根据样本分布选择一个较小的值,然后通过交叉验证来选择一个比较合适的最终值;
当选择比较小的K值的时候,表示使用较小领域中的样本进行预测,训练误差会减小,但是会导致模型变得复杂,容易导致过拟合;
当选择较大的K值的时候,表示使用较大领域中的样本进行预测,训练误差会增大,同时会使模型变得简单,容易导致欠拟合;
2、距离度量
一般使用欧几里德距离
关于距离度量,还有其他方式
3、决策规则
KNN在做回归和分类的主要区别在于最后做预测时的决策方式不同:
(1)分类预测规则:一般采用多数表决法或者加权多数表决法
假设图中 “?”表示待预测样本,红色圆表示一类,蓝色方块表示一类,2和3表示到待预测样本的距离
1. 多数表决法:
每个邻近样本的权重是一样的,也就是说最终预测的结果为出现类别最多的那个类;
如图,待预测样本被预测为红色圆
2. 加权多数表决法:
每个邻近样本的权重是不一样的,一般情况下采用权重和距离成反比的方式来计算,也就是说最终预测结果是出现权重最大的那个类别;
如图,红色圆到待预测样本的距离为3,蓝色方块到待预测样本的距离为2,权重与距离成反比,所以蓝色的权重比较大,待预测样本被预测为蓝色方块。
(2)回归预测规则:一般采用平均值法或者加权平均值法
假设上图中的2和3表示邻近样本的目标属性值(标签值),此时没有类别,只有属性值
1、平均值法
每个邻近样本的权重是一样的,也就是说最终预测的结果为所有邻近样本的目标属性值的均值;
如图,均值为(3+3+3+2+2)/5=2.6
2、加权平均值法
图中,双箭头线上的数表示到待预测样本的距离
每个邻近样本的权重是不一样的,一般情况下采用权重和距离成反比的方式来计算,也就是说在计算均值的时候进行加权操作;
如图,权重分别为(各自距离反比占距离反比总和的比例):
属性值为3的权重:
属性值为2的权重:
待预测样本的加权平均值为:
三、手写 k 近邻算法
实现kNN分类算法的伪代码:
对未知类别属性的数据集中的每个点依次执行一下操作:
(1)计算已知类别数据集中的点与当前点之间的距离
(2)按照距离递增次序排序
(3)选取与当前点距离最小的k个点
(4)确定前k个点所在类别的出现频数
(5)返回当前k个点出现频数最高的类别作为当前点的预测分类
欧氏距离公式:
例如求点(1,0,0,1) (1,0,0,1)(1,0,0,1)和(7,6,9,4) (7,6,9,4)(7,6,9,4)之间的距离:
检测分类器效果:
可以使用已知类别的数据(当然不告诉分类器),检验分类器给出的结果是否与已知类别相同,通过大量的测试数据,我们可以计算出分类器的错误率。
以上算法的实现是用于分类的,决策规则使用了多数表决法;此算法通过改变决策规则,同样可以用于回归。
源代码可见:https://github.com/Daycym/Machine_Learning/tree/master/03_KNN;01_k近邻算法.py
四、使用手写k kk 近邻算法的案例
1、案例1:约会网站的配对效果
样本包括3种特征:
每年获得的飞行常客里程数
玩视频游戏所耗时间百分比
每周消费的冰淇淋公升数
样本包括3种标签:
不喜欢的人
魅力一般的人
极具魅力的人
部分数据格式为:
代码可见:02_约会网站的配对效果.py
2、案例2:手写数字识别系统
数据集包括训练集和测试集
数据是32*32的二进制文本文件
需要将文本数据转换为Numpy数组
如下是0的一种表示:
100000000000001100000000000000000
200000000000011111100000000000000
300000000000111111111000000000000
400000000011111111111000000000000
500000001111111111111100000000000
600000000111111100011110000000000
700000001111110000001110000000000
800000001111110000001110000000000
900000011111100000001110000000000
1000000011111100000001111000000000
1100000011111100000000011100000000
1200000011111100000000011100000000
1300000011111000000000001110000000
1400000011111000000000001110000000
1500000001111100000000000111000000
1600000001111100000000000111000000
1700000001111100000000000111000000
1800000011111000000000000111000000
1900000011111000000000000111000000
2000000000111100000000000011100000
2100000000111100000000000111100000
2200000000111100000000000111100000
2300000000111100000000001111100000
2400000000011110000000000111110000
2500000000011111000000001111100000
2600000000011111000000011111100000
2700000000011111000000111111000000
2800000000011111100011111111000000
2900000000000111111111111110000000
3000000000000111111111111100000000
3100000000000011111111110000000000
3200000000000000111110000000000000
预测错误的总数为:10
手写数字识别系统的错误率为:0.010571
代码可见:03_手写数字识别系统.py
五、KD树
KNN算法的重点在于找出K个最邻近的点,主要方法如下:
1、蛮力实现(brute)
计算出待预测样本到所有训练样本的训练数据,然后选择最小的K个距离即可得到K个最邻近点;
当特征数比较多,样本数比较多的时候,算法的执行效率比较低。
2、KD树(KD_Tree)
KD_Tree算法中,首先是对训练数据进行建模,构建KD树,然后再根据构建好的模型来获取邻近样本数据
KD_Tree是KNN算法中用于计算最近邻的快速、便捷构建方式
除此之外,还有一些从KD_Tree修改后的求解最邻近点的算法,比如:Ball Tree、BBF Tree、MVP Tree等
当样本数据量少的时候,我们可以使用brute这种暴力的方式进行求解最近邻,即计算到所有样本的距离。
当样本量比较大的时候,直接计算所有样本的距离,工作量有点大,所以在这种情况下,我们可以使用kd tree来快速的计算。
(1)KD数的构建
KD树采用从m个样本的n维特征中,分别计算n个特征取值的方差,用方差最大的第 k 维特征作为根节点。对于这个特征,选择取值的中位数
作为样本的划分点,对于小于该值的样本划分到左子树,对于大于等于该值的样本划分到右子树,对左右子树采用同样的方式找方差最大的特征作为根节点,递归即可产生KD树。
假设二维样本为:{(2, 3), (5, 4), (9, 6), (4, 7), (8, 1), (7, 2)},下面我们来构建KD树:
1、计算每个特征的方差,取方差最大的作为根节点
方差表示数据的离散程度,离散程度越大,值越大。因此,选择第1维特征x1作为根节点。
2、选取中位数作为划分点
x1取值为2,4,5,7,8,9 2,4,5,7,8,92,4,5,7,8,9中位数取7来划分,小于该值的放在左子树,大于该值的放在右子树
3、特征空间划分:
(2)KD tree查找最近邻
当我们生成KD树以后,就可以取预测测试集里面的样本目标点了。
对于一个目标点,我们首先在KD树里面寻找包含目标点的叶子节点;
以目标点为圆心,以目标点到叶子节点样本实例的距离为半径,得到一个超球体,最近邻的点一定在这个超球体内部;
然后返回叶子节点的父节点,检查另一个子节点包含的超矩形体是否和超球体相交,如果相交就到这个子节点寻找是否有更加近的近邻,有点话就更新最近邻;如果不相交那就直接返回父节点的父节点,在另一个子树继续搜索最近邻;
当回溯到根节点时,算法就结束了,保存最近邻节点就是最终的最近邻。
假设要寻找点(2,2.5) (2,2.5)(2,2.5)的最近邻点:
六、KNN案例
1、鸢尾花数据分类
使用Logistic算法和KNN算法对鸢尾花数据进行分类,比较结果;
具体内容在代码的注释中有介绍;
画出下面两张图,需要将代码整合起来,才能画出来。
代码可见:https://github.com/Daycym/Machine_Learning;02_Logistic回归下05_鸢尾花数据分类.py,以及03_KNN目录下04_鸢尾花数据分类.py。
2、信贷审批
具体内容将在代码中介绍
代码可见:https://github.com/Daycym/Machine_Learning;02_Logistic回归下03_信贷审批.py,以及03_KNN目录下05_信贷审批.py。
七、总结
本篇主要通过简单的暴力求解的方式实现KNN算法,有助于理解KNN算法
后面又介绍了KD树找K个最近邻,此算法是最快捷的
最后通过sklearn库下的KNeighborsClassifier实现了两个案例,来属性KNN模型的构建
原文链接:
https://blog.csdn.net/Daycym/article/details/84452786
(*本文为AI科技大本营转载文章,转载请联系原作者)
◆
推荐
◆
推荐阅读
真的,Pornhub比今日头条或是Netflix更了解你爱看什么
印度小哥“神剑”:PDF提取表格so easy!
老程序员肺腑忠告:千万别一辈子靠技术生存!
开除“野狗”式程序员,团队的效率提高了
微博回应裁员;罗永浩股权被冻结;“隐形贫困”人群最爱苹果 | 极客头条
企业云存储建设之路
特别策划 | 盘点区块链的2018:技术与工具演进篇
春运渡劫!会Python能帮我抢回家的火车票吗?
技术流 | 手把手教你用Python设计一个命令行界面
相关文章:
致那些还在创业之路上孤独前行的青年大学生们!
彩虹,在大雨后出现 腊梅,在风雪中吐蕊 雄鹰,在险峰上空盘旋 人,在困境中弥坚 在这个创业的浪潮中 你是否也是其中之一 当所有事情都将有你一个人来完成 你是否有信心和能力把它做好 成功不是回首,不是寄望,…

MS DTC 无法正确处理 DC 升级/降级事件的解决
当Windows 2003安装AD后,经常出现以下警告信息的解决方法:MS DTC 无法正确处理 DC 升级/降级事件。MS DTC 将继续运行并将使用现有的安全设置。错误说明: %1, 打开管理工具的组件服务管理控制台,打开组件服务,计算机。右击我的电…

UML图的分类
作为一种建模语言,UML的定义包括UML语义和UML表示法两个部分。 (1) UML语义 描述基于UML的精确元模型定义。元模型为UML的所有元素在语法和语义上提供了简单、一致、通用的定义性说明,使开发者能在语义上取得一致,消除了因人而异的最佳表达方法所造成的影响。此外UML还支持对元…
告诫那些有创业梦的大学生,切记千万不要盲目创业!
如果你打算创业,那么最好具备两点: 一是有一定的经济实力或行业经验和人脉, 二是没有太多后顾之忧。 有一部分创业者是前期赚了一些钱,能确保基本生活的质量!所以可以全身心投入到创业中,提高成功的概率。然…

春运渡劫!Python给我抢回家的火车票
简介:本文首发于个人公众号「视学算法」,作者阿广,一个专注于大数据、人工智能和算法的学习平台,也是一个保送中科院软件研究所直博生的自留地。人生苦短,我愿做您最忠实的技术支持伙伴!一起用代码改变世界…

首次成功实施 XSS 攻击,盗取目标网站大量 VIP 帐号
前言 之前做网站时有做代码防御 XSS(Cross Site Script) 攻击,但是却只处于了解的阶段,并不知道其中具体的原理,更别说使用了。最近有朋友要求我帮助他 Hack 一个网站,达到一定的目的。思考来思考去,最后想了一套方案&…

oracle取得表中总记录数最快的方法
查询表中的记录总数的语法就是SELECT COUNT(*) FROM TABLE_NAME。这可能是最经常使用的一类SQL语句。 本文讨论怎样才能最快的得到这个记录数。本文纯粹主要是理论上的讨论,文章中很多内容(如常数索引)对实际的指导意义不大。 在具体描述之前…
你的创业前行之路,亲君愿与你一路相随
每一个创业者都是黑暗中的独行侠, 然后告诉别人光明就在前方, 其实, 他们自己心里也不知道光明还有多远。 无论当初是因为理想还是因为实现个人价值, 只要走上创业这条路, 我们就只能不断的告诉自己和他人:…

年度重磅:《AI聚变:2018年优秀AI应用案例TOP 20》正式发布
2018 年,AI 行业的关键词或许非“落地”二字莫属 ,人们强烈期待着更多 AI 技术应用和深入商业化。 一方面,科技巨头们在横向铺设 AI 技术平台,但也更强调 AI 与每一个垂直行业的深度融合。而另一面,AI 创业公司在频繁刷…

防止熊猫烧香的微软补丁
为了防止熊猫烧香病毒,要及时安装微软的安全更新,不要随意访问来源不明的网站。特别是微软的MS06-014漏洞,应立即打好该漏洞补丁。 不知道这个补丁是不是已经打上的朋友,一是在控制面板里可以看到.(勾上显示更新前面的方框),或者下载360安全卫士,扫描漏洞…

【Azure Services Platform Step by Step-第11篇】Windows Azure兰州拉面馆-日志与队列的使用...
在第9篇里,为了便于大家理解,我把Windows Azure的环境比喻成了"Azure兰州拉面馆"。本篇我们继续沿用这个比喻,讲讲Windows Azure中的队列(Queue Storage)与日志的使用。 Queue Storage在【Azure Services Platform Step by Step-第…
这才是世界排名前十位的奢侈品
真正的奢侈品,不是豪车大宅,不是名包贵表,而是这些…… 1. 一颗童心2. 生生不息的信念3. 背包走天下的健康体魄4. 愉悦和舒心的工作环境5. 安稳平和的睡眠6. 享受属于自己空间与时间的生活7. 牵手一个教会你爱与被爱的人8. 品味美好的心情…

配置springmvc在其他类中(spring容器外)获取注入bean
今天在写JedisUtils的时候要注入JedisPool,而这个属性被设置为static,Resource和Autowired都不可以注入,因为spring不能为静态变量依赖注入。因此需要额外的方法获取spring管理的bean。本文即SpringContextHolder: 1 package com.…

声智科技完成2亿元B轮融资,将持续拓展语音交互产品的规模化落地
整理 | 一一出品 | AI科技大本营寒冬之下,不少创业公司依然得到了资本青睐。AI科技大本营消息,12 月 29 日消息,声智科技(SoundAI)已于近期完成 2 亿人民币 B 轮融资,本轮投资由毅达资本领投,峰…

360度看IT行业--3月12日西安工程大学讲座
2009年3月12日,一个绿色的好日子。当天晚上7点30分,在西安工程大学的讲座开始了。西安工程大学的孩子们很热情,大一大二的居多,虽然是非计算机专业,但提前就满满的坐在会场等待了。而且很关注IT行业,提了很…

专访中国移动钱岭:大数据更像是一种“倍增器”
记者 | 杨丽出品 | AI科技大本营(rgznai100)为把握时代特征,2016 年中国移动确定并大力推动“大连接”战略,并制定了“十三五”时期做大连接规模、做优连接服务、做强连接应用的三个目标。如今,这家企业已经拥有 9.16 亿移动端用户…

创业者应该如何看待金钱
什么是真正的赢?一个高智商、高情商的商人,经营企业追求的终极目标就是一个赢字:金钱、地位、豪宅、名车、美女、权利、荣耀,为了赢得这些,很多人曾不择手段,曾不断地苦苦寻找“如何以最小的投入快速获得最…

Exchange与ADFS单点登录 PART 2:部署和配置ADFS
在第一篇文章完了之后,我们就可以在我们的服务器上部署ADFS了,安装的方法很简单,直接在服务器管理器中添加功能角色即可,选择当前服务器并在服务器角色中选择ADFS。 完成之后我们需要对ADFS进行详细的配置,在服务器管理…

路由器和交换机的综合实验
路由器和交换机的综合实验<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />主要目标:1. 跨交换机(二层交换机)的相同VLAN 之间的通讯2. 不同VLAN之间的通讯1) 通过路由器实现不同VL…

如何写出符合Python审美的代码风格?
作者 | Rocky0429来源 | Python空间本文为 AI科技大本营投稿文章(欢迎给我们投稿,投稿请联系微信1092722531)写在之前每个人都有自己的代码风格,随着写的行数增加,自己对于代码的审美也会变的不一样,这就像…

程序员都该懂点 HTTP
作者:developerHaozGithub 地址:developerHaoz说明:本文主要是对 HTTP 基础知识进行总结和归纳,毕竟做 IT 的,网络这一块还是很重要的 本文的主要内容HTTP 是什么URL 详解HTTP 之请求篇HTTP 之响应篇一、HTTP是什么1、…

谁的青春不迷茫,其实我们都一样
如果你为人生画一条浅浅吃苦底线,就别妄想跨越深邃的幸福极限。在熠熠生辉前,总要捱过一段孤独不安的日子。唯有担得起厚重的经历,才能禁得起岁月推敲。记住:一定要努力,但别着急。加油! 很庆幸你能以这样好…

关于Iframe在IE6下不显示的bug
IE都出到IE8了,用IE6的人渐渐少了..但还是存在的.例如QAMM们在用. 所以,IE6下存在的问题也必须解决.这两天,我就遇到一个了: html<table> <tr> <td id"tdTest" runat"server"> <iframe id"ifrTest" h…

腾讯优图吴永坚:迈向深度学习,我们面临模型训练与推荐的双重考验
整理 | 琥珀出品 | AI 科技大本营对腾讯优图的发展历程,吴永坚表示,优图是非常幸运的,幸运的同时也知道优图选对了方向,只要坚持,还是会有收获的。12 月 15 日,以"新趋势、新技术、新应用"为主题…

JS子窗口调用父窗口中的函数
很简单只需要一句话就可以了: window.opener.changeColor(); 这里的changeColor()就是父窗口中JS的一个函数 本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/377011,如需转载请自行联系原作者

父亲节遇上端午节,你难道不回家吗?
创业者是孤独的 他们选择了更加艰险的人生。 同时,他们又是幸运的 因为他们背后有一位伟大的父亲。 决定创业时 他说:“大胆去闯吧,有爸爸在” 创业失败时 他说:“累了就回家,有爸爸在” 简单朴实的话语包含的是无私广…

蜘蛛爬虫网络高像素图片抓取工具[搜索引擎]
ZSpider—— 是一款Photo crawler工具。主要功能:免费抓取网络高像素图片,并下载到本地。使用说明:1. 软件环境:Windows XP, 20003, Vista, 2008, Windows 7.NET Framework 3.52. 双击Spider.exe,选择菜单,…

技术流 | 手把手教你用Python设计一个命令行界面
作者 | Yannick Wolff 译者 | 刘旭坤 整理 | Jane出品 | Python大本营对 Python 程序来说,完备的命令行界面可以提升团队的工作效率,减少调用时可能碰到的困扰。今天,我们就来教大家如何设计功能完整的 Python 命令行界面。对 …
送给那些还在迷茫的人
在现在这个高节奏的高效率的时代,两级分化特别厉害。有钱的会越来越有钱,没钱的要么安于现状,要么就越来越穷。 这种思维的产生根源就是不懂得把握机会,其实机会这个东西很奇妙,有时候我们自己也能发现有个机会就摆…

cisco路由器与QOS技术
1 前言随着因特网的普及,网络和人们生活的关系愈加密切,多样化的业务(数据、语音、视频等)应运而生。通常,这些业务对于通信条件的要求各不相同:数据业务对传递的可靠性要求非常高,误码率是最重…