KNN(k-nearest neighbor)是一个简单而经典的机器学习分类算法,通过度量”待分类数据”和”类别已知的样本”的距离(通常是欧氏距离)对样本进行分类。 
这话说得有些绕口,且来分解一番: 
(1)分类问题都是监督(supervised)问题,也就是说一定数量的样本类别是已知的。 
(2)既然我们已经有了一批分好类的样本,那么接下来的工作自然应该是通过已知样本训练分类器(通过调节分类器的参数,使分类器能够正确对训练样本分类),把分类器训练好以后用于对未知样本的分类(或类别预测)。 
看上去就是这么回事,问题的关键在于分类器的训练。 
但对于KNN分类器来说,事情并不是这个样子的。其实KNN并没有这么复杂。因为KNN并没有什么参数要调,换句话说,KNN其实并不需要训练! 
作为最简单也最好理解的分类器,KNN只是假设数据都分布在欧式的特征空间内(以特征值为坐标区分不同样本的空间),然后我们恰好又知道全部数据在这个空间中的位置以及其中一部分数据的类别。那么现在我们怎么判断剩余那些数据的类别呢? 
为了让分类进行下去,这里其实我们假设:空间中距离越近的点属于一类的可能性越大。 
有了这条“公理”,那事情就好办多了。我们只需要计算每个待分类数据到全部已知类别数据的距离就好了。如图: 
 
有正方形和三角形两个已知类,假如中间的圆形我们不知道它到底是三角形还是正方形。按照上面说的,我们可以正儿八经计算一下它到其他所有点的距离。在这里为了简便,我们目测一下发现它离旁边的三角形最近,好嘞,那么我们就把它归为三角形一类的。 
注意这里我们把未知点和离它最近的那一个点归为一类。这样的分类器,准确来说叫最近邻分类器(nearest-neighbor,NN)。这是KNN的特殊情况,是K=1的情况。 
那么K近邻,顾名思义,就是要一个未知点参考离它最近的前k个一直类别的点,看在这k个点里面,属于哪个类别的点最多,就认为未知点属于哪一类。还是上面的图,以圆形未知点为圆心,在实线画出的圆中,相当于k=3,也就是选了前三个离得最近的点,其中三角形2个,方形1个,所以未知点归到三角形一类。但是当考虑虚线范围内时,也就是k=5时,我们发现方形3个,三角形2个,所以这个时候未知点归到方形一类了。 
所以我们可以发现,不同的最近邻个数往往会导致不同的分类结果,一般来说,我们在实际应用中要根据实际情况和经验确定k的取值。

算法流程 
对每一个未知点执行:

  1. 计算未知点到所有已知类别点的距离
  2. 按距离排序(升序)
  3. 选取其中前k个与未知点离得最近的点
  4. 统计k个点中各个类别的个数
  5. 上述k个点里类别出现频率最高的作为未知点的类别

优缺点

  1. 优点: 
    简单有效、易理解
  2. 缺点: 
    k近邻需要保存全部数据集,因此对内存消耗大,当数据集较大时对设备要求非常高; 
    需要计算每个未知点到全部已知点的距离,可能会很耗时; 
    分类结果不易理解
原理:

如图已有分类基础上若新来了点该如何分类?

根据离得最近的点中找最近的k个点以这几个点的类别(label)进行投票以最后比例确定新的点类别的更大可能性

本质:如果两个样本足够的相似的话他们就有更高的可能性属于同一类别

实现:

例如图示为肿瘤时间与大小对于肿瘤的分类的影响,蓝色为恶性肿瘤,红色为良性肿瘤,当新来一个数据时(绿色数据点)如何判断它的类别?

编程实现预测:

KNN实现过程

#求预测点到最近k个点的距离然后投票

欧拉距离定义

从距离数组中获得最近的k个点,如果将X排序,与y则不对应,此处想获得的是索引,所以可以用argsort方法进行排序获得其索引找到最近的k个点在哪

Python的collection.Counter很好的支持投票结果的选取

获得投票结果为1所以y的预测结果为1

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34734683/article/details/79485226
文章标签: KNN分类算法
个人分类: Mechine Learning之KNN

分类算法学习(一)——KNN算法的原理及简单实现相关推荐

  1. knn聚类还是分类_数据分析基本算法模型之KNN算法

    最近失业了...sad 休息了一个月,然后就想着找工作的事情.浏览了一些职位的JD,发现上面都会写了解机器学习算法模型,掌握回归.分类.聚类balabala.这就让我有点蛋疼了,这些在之前工作上都没怎 ...

  2. Surf算法学习心得(一)——算法原理

    Surf算法学习心得(一)--算法原理 写在前面的话: Surf算法是对Sift算法的一种改进,主要是在算法的执行效率上,比Sift算法来讲运行更快!由于我也是初学者,刚刚才开始研究这个算法,然而网上 ...

  3. 【StatLearn】统计学习中knn算法实验(2)

    接着统计学习中knn算法实验(1)的内容 Problem: Explore the data before classification using summary statistics orvisu ...

  4. java knn文本分类算法_使用KNN算法的文本分类.PDF

    使用KNN算法的文本分类.PDF 第31 卷 第8 期 计 算 机 工 程 2005 年4 月 Vol.31 8 Computer Engineering April 2005 人工智能及识别技术 文 ...

  5. 算法学习四:算法性能分析理论基础——函数增长与渐进分析

    算法学习四:算法性能分析理论基础--函数增长与渐进分析 在算法性能分析过程中,特别是在算法运行效率分析中,我们经常使用渐渐分析法,它使我们在分析算法性能时不必纠结于不同硬件平台的差异性,着重考虑算法的 ...

  6. 机器学习与深度学习——通过knn算法分类鸢尾花数据集iris求出错误率并进行可视化

    什么是knn算法? KNN算法是一种基于实例的机器学习算法,其全称为K-最近邻算法(K-Nearest Neighbors Algorithm).它是一种简单但非常有效的分类和回归算法. 该算法的基本 ...

  7. K近邻算法学习(KNN)

    K近邻算法--KNN 机器学习--K近邻算法(KNN) 基本知识点 基本原理 示例 关于KNN的基本问题 距离如何计算? k如何定义大小? k为为什么不定义一个偶数? KNN的优缺点 代码实现 第一次 ...

  8. k近邻算法_K近邻(knn)算法是如何完成分类的?

    摘要:K近邻算法是机器学习中的一个非常基础的算法.本文通过自生成数据,通过绘图的方式演示KNN算法的思路,让你不看数学公式就看了解什么是KNN算法. 关键词:KNN算法 1 生成一个二分类的数据集 本 ...

  9. Machine Learning In Action 第二章学习笔记: kNN算法

    本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数 ...

  10. 令人拍案叫绝的算法学习网站新手算法入门到精通,算法面试冲刺资料这里都有

    (9月已更)学算法认准这6个网站就够了! 写在前面:作为ACM铜牌选手,从FB到腾讯,从事算法&java岗位工作也是5年有余.在工作中接触到了很多同学,在算法学习和算法面试这件事上我还是很有发 ...

最新文章

  1. 运行jsp时,报错404
  2. 信息安全系统设计基础第二次实验
  3. easyui中combobox 验证输入的值必须为选项框中的数据
  4. php如何使用遮罩,CSS绝对定位实现窗口遮罩功能:2019年1月15日作业
  5. Razor语法和Razor引擎大全
  6. 为什么现在的手机用4个摄像头?越来越难看。就不能只用一个摄像头吗?
  7. 9.Linux/Unix 系统编程手册(上) -- 进程凭证
  8. Ambari技术介绍-尚硅谷大数据培训
  9. NPT、PT、G 、ZG、RC、M几种螺纹的区别
  10. aliddns ipv6_python脚本实现ipv6的ddns功能
  11. android系统定制教程,Android系统DIY修改 定制第三方ROM教程
  12. CSS卡贴悬停展开效果
  13. python中scale啥意思_scale什么意思
  14. Html开发需要的环境
  15. 活动并发测试-1000个不同用户同时并发请求报名笔记
  16. Axure教程:用中继器制作调查问卷/考试试卷
  17. How to set up the esp-hosted SDK compilation environment for ESP32-C3
  18. 什么是事件冒泡机制?
  19. Camunda流程引擎 Modeler (二)
  20. 2018年总结和职场规划

热门文章

  1. 部署KMS激活后用户端一些情况的确认
  2. 存储知识学习之--IP网络存储iSCSI的概念与工作原理
  3. 自适应滤波——线性预测(LPC)
  4. 01我为什么学Unity3d
  5. 跑酷游戏的一些bug总结(滥用FixedUpdate的坑)
  6. 让图片左右缓慢移动的MoveView
  7. 解析JDK 7的Garbage-First收集器
  8. [Vue] : vue-resource 实现 get, post, jsonp请求
  9. Android学习笔记(十二)——使用意图传递数据的几种方式
  10. poj 2442 Sequence