一、引入

问题:确定绿色圆是属于红色三角形、还是蓝色正方形?

KNN的思想:

从上图中我们可以看到,图中的数据集是良好的数据,即都打好了label,一类是蓝色的正方形,一类是红色的三角形,那个绿色的圆形是我们待分类的数据。

如果K=3,那么离绿色点最近的有2个红色三角形和1个蓝色的正方形,这3个点投票,于是绿色的这个待分类点属于红色的三角形

如果K=5,那么离绿色点最近的有2个红色三角形和3个蓝色的正方形,这5个点投票,于是绿色的这个待分类点属于蓝色的正方形

即如果一个样本在特征空间中的k个最相邻的样本中,大多数属于某一个类别,则该样本也属于这个类别。我们可以看到,KNN本质是基于一种数据统计的方法!其实很多机器学习算法也是基于数据统计的。

二、KNN算法

1.介绍

KNN即K-Nearest Neighbor,是一种memory-based learning,也叫instance-based learning,属于lazy learning。即它没有明显的前期训练过程,而是程序开始运行时,把数据集加载到内存后,不需要进行训练,就可以开始分类了。

KNN也是一种监督学习算法,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离最近的邻居进行分类判(投票法)或者回归。若K=1,新数据被简单分配给其近邻的类。

2.步骤

1)计算测试数据与各个训练数据之间的距离;

(计算距离的方式前文讲k-means时说过,不清楚的可以去查看以下➡传送门)

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

K值是由自己来确定的

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

说明:对于步骤5的预测分类有以下两种方法

  • 多数表决法:多数表决法类似于投票的过程,也就是在 K 个邻居中选择类别最多的种类作为测试样本的类别。
  • 加权表决法:根据距离的远近,对近邻的投票进行加权,距离越近则权重越大,通过权重计算结果最大值的类为测试样本的类别。

特点

非参数统计方法:不需要引入参数

K的选择:

K = 1时,将待分类样本划入与其最接近的样本的类。

K = |X|时,仅根据训练样本进行频率统计,将待分类样本划入最多的类。

K需要合理选择,太小容易受干扰,太大增加计算复杂性。

算法的复杂度:维度灾难,当维数增加时,所需的训练样本数急剧增加,一般采用降维处理。

三、算法优缺点

优点

  1. 简单、有效。
  2. 重新训练的代价较低(类别体系的变化和训练集的变化,在Web环境和电子商务应用中是很常见的)。
  3. 计算时间和空间线性于训练集的规模(在一些场合不算太大)。
  4. 由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
  5. 该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。

缺点

  1. KNN算法是懒散学习方法(lazy learning),而一些积极学习的算法要快很多。
  2. 需要存储全部的训练样本
  3. 输出的可解释性不强,例如决策树的可解释性较强。
  4. 该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算最近的邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
  5. 计算量较大。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。

四、KNN与K-means的区别

废话不多说,咱直接上图:

相似点:

虽然两者有很大且别,但两者也有共同之处。都包含了一个过程:给定一个点,在数据集找离它最近的点,即都用到了NN(Nearest Neighbor)算法。

五、python实例实现

下面引入一个实例,通过python代码具体看下KNN算法的流程。

from numpy import *import operatordataSet = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])labels = ['A','A','B','B']def classify0(inX,dataSet,labels,k): #求出样本集的行数,也就是labels标签的数目 dataSetSize = dataSet.shape[0] #构造输入值和样本集的差值矩阵 diffMat = tile(inX,(dataSetSize,1)) - dataSet #计算欧式距离 sqDiffMat = diffMat**2 sqDistances = sqDiffMat.sum(axis=1) distances = sqDistances**0.5 #求距离从小到大排序的序号 sortedDistIndicies = distances.argsort() #对距离最小的k个点统计对应的样本标签 classCount = {} for i in range(k): #取第i+1邻近的样本对应的类别标签 voteIlabel = labels[sortedDistIndicies[i]] #以标签为key,标签出现的次数为value将统计到的标签及出现次数写进字典 classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #对字典按value从大到小排序 sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #返回排序后字典中最大value对应的key return sortedClassCount[0][0]if __name__ == '__main__': print(classify0([1.1,0],dataSet,labels,3))

私信我:“学习”,可免费领取更多相关学习资料 (免费的哦)。

knn算法python代码_K-最近邻分类算法(KNN)及python实现相关推荐

  1. python代码打好了怎么运行-python代码是怎样运行的

    python作为一种动态语言,其实是一个解释器软件包.当Python运行脚本时,在代码开始进行处理之前,Python还会执行一些步骤.第一步是编译成所谓的"字节码",如果Pytho ...

  2. python代码加密cython_利用Cython对python代码进行加密

    利用Cython对python代码进行加密 Cython是属于PYTHON的超集,他首先会将PYTHON代码转化成C语言代码,然后通过c编译器生成可执行文件.优势:资源丰富,适合快速开发.翻译成C后速 ...

  3. latex附录中放python代码_在Latex中插入Python代码

    这里指的插入是指最终能在生成的pdf中显示高亮的Python代码. 在Latex中插入Python代码,需要一个第三发的宏包pythonhighlight: https://github.com/ol ...

  4. python代码写好了怎么运行-python代码是怎样运行的

    python作为一种动态语言,其实是一个解释器软件包.当Python运行脚本时,在代码开始进行处理之前,Python还会执行一些步骤.第一步是编译成所谓的"字节码",如果Pytho ...

  5. 水仙花数python代码for_水仙花数如何用python代码表示?

    水仙花数如何用python代码表示? 水仙花数的python代码为: 水仙花数是指一个3位正整数,它的每个位上的数字的3次幂之和等于它本身.(例如:1^3 + 5^3+ 3^3 = 153) 下面用一 ...

  6. k邻近算法python代码_机器学习算法之K近邻法-Python实现

    一.算法简介 k近邻法(k-nearest neighbor,k-NN)是一种基本的分类方法,输入的是实例的特征向量,对应于特征空间的点,输出结果为实例的类别,可以取多类.对于训练集来说,每个实例的类 ...

  7. 跳一跳j算法ava代码_DBSCAN聚类算法的理解与应用

    在前面的文章中,我们讲了KNN算法的原理与简单应用,KNN一种有监督学习的分类算法,也就是说该算法首先需要训练数据来进行学习之后才能对数据进行分类.在本文中我们讲到的DBSCAN聚类算法,也属于一种数 ...

  8. l bfgs算法java代码_优化算法——拟牛顿法之L-BFGS算法

    一.BFGS算法 BFGS算法的校正公式: 利用Sherman-Morrison公式可对上式进行变换,得到 令 ,则得到: 二.BGFS算法存在的问题 在BFGS算法中.每次都要存储近似Hesse矩阵 ...

  9. python代码编辑器-世界上最好的Python编辑器是什么?

    原标题:世界上最好的Python编辑器是什么? 世界上最好的 Python 编辑器或 IDE 是什么?炫酷的界面.流畅的体验,我们投 PyCharm 一票,那么你呢?本文介绍了 PyCharm.Jup ...

  10. 简单python代码实例_求简洁优美的python代码例子、片段、参考资料

    展开全部 建2113议你去看一本书:<计算机程序5261的构造与解释>.里面4102用的语言是Scheme,一种Lisp的方言.通1653过这本书学习程序的抽象.封装,以及重要的函数式编程 ...

最新文章

  1. 无法远程访问Mysql的解决方案
  2. java实现递归下降分析_使用递归实现检查未知层级目录中的文件-Java实用技能
  3. elasticsearch 集群no known master node
  4. Android开发之APP唤醒小程序,打开小程序,调起小程序以及传参数的实现方法(附加源码)
  5. mysql sql优化及注意事项
  6. Unity3D入门(二):碰撞检測
  7. 流程图动画效果html,jQuery创意线条步骤流程图动画特效
  8. curl的安装与配置
  9. python3.4勾股定理代码_python计算器代码
  10. [CAN BUS] USB-CAN adpter / USB转CAN 开源项目推荐(CANable candlelight cangaroo)
  11. TTL转RS485电路
  12. 【Social listening实操】从社交媒体传播和文本挖掘角度解读《欢乐颂2》
  13. 【项目实战】高并发内存池
  14. 大数据时代 无处安放的隐私数据
  15. 体脂秤方案开发脂肪秤方案设计
  16. 机器学习入门-西瓜书总结笔记第十六章
  17. 上海科技大学计算机浙江分数线,2018上海科技大学录取分数线
  18. ES6 lterator迭代器是个什么东西?有什么用?
  19. 学计算机颈椎痛,每天对着电脑颈椎很疼怎么办
  20. 计算机缺少什么无法正常启动,应用无法正常启动是什么意思

热门文章

  1. apache karaf_未来是Apache Karaf上的微服务架构
  2. 专业QA如何实施可靠的CI / CD管道?
  3. java 基础包的功能_Java 8的功能基础
  4. 具有Azure功能的无服务器API
  5. QueryDSL中包含通配符的字符串的精确匹配
  6. Cactoos中的面向对象的声明式输入/输出
  7. moxy json介绍_MOXy的对象图和动态JAXB
  8. 您应该保持联系的十大高级Java对话
  9. JIT编译器,内联和转义分析
  10. 使用Spring JUnit规则进行参数化集成测试