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

一、引入

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

9ef7aa9067bfdfc7ee30db67f3a32f75.png

KNN的思想:

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

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

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

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

a97ba3f0c6344c60fa4ce9da055b2863.png

二、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的区别

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

5895031ee18023a5b77f3ad1171186ba.png

相似点:

虽然两者有很大且别,但两者也有共同之处。都包含了一个过程:给定一个点,在数据集找离它最近的点,即都用到了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))

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

e969201fcd507d0424ac80409ce16432.png
75c364fd00c56cc97ac2863ccc9ace8a.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 19. 删除链表的倒数第N个节点

原题链接 解法:双指针 思路:第一个点可以能被删除,所以需要一个虚拟头节点。被删除的点位于倒数第n的位置,因为是单链表,即找到倒数n 1最后,想要删除这个节点必须要保留它的前一个节点使其p->next …

rxjava 并行_使用RxJava和Completable并行执行阻塞任务

rxjava 并行通过RxJava 1.1.1中引入的Completable抽象,如何并行执行阻止“仅副作用”(也称为void)任务的并行执行变得更加容易。 “ 正如您可能已经注意到,阅读我的博客时,我主要专注于软件Craft.io和自动代码测试。 …

系统工程师主要做什么_Filecoin运维工程师在做什么?

前言固然运维这个职能范畴对于绝大多数人来说认知模糊,特别是在分布式存储领域,“运维”常常和“机房”“IDC”等名词相伴,导致很多异业者对于运维的了解停留在物理层面,以搬运机器、上下架服务器、管理网电等为标杆,好…

Leecode 136. 只出现一次的数字

原题链接 解法&#xff1a;异或运算 A^A0 A^0A class Solution { public:int singleNumber(vector<int>& nums) {int ret 0;for(auto p : nums) ret^p;return ret;} };

jdk 9和jdk8_了解有关JDK9紧凑弦乐的信息(视频评论Charlie Hunt)

jdk 9和jdk8JDK 9引入了一个称为紧凑字符串的新功能。 鉴于Java程序中字符串的普遍存在&#xff0c;我认为这是一个非常重要的更改&#xff0c;所有Java开发人员都需要理解。 在此视频中&#xff0c;查理亨特&#xff08;Charlie Hunt&#xff09;解释了此新功能的历史和实现。…

mysql怎么返回上一行_月球上并没有发射基地,阿波罗飞船是怎么返回地球的?...

美国上世纪六七十年代成功实施了载人登月工程&#xff0c;这一壮举震惊世界。阿波罗系列载人登月飞船和用于发射飞船的土星五号运载火箭名声大噪&#xff0c;而用于发射土星五号&#xff0c;位于卡纳维拉尔角肯尼迪航天发射中心的39号发射台也格外引人瞩目。土星五号全长110多米…

java中接口私有反方_Java 8:在接口中声明私有和受保护的方法

java中接口私有反方引入Java 8时&#xff0c;我们可以在接口中使用默认方法。 此功能的主要驱动程序是允许接口扩展&#xff0c;同时保留对旧接口版本的向后兼容性。 一个示例是在现有Collection类中引入stream()方法。 有时候&#xff0c;当我们想引入几种默认方法时&#xf…

凯立德地图导航2020年最新版车载_明明有车载导航,为什么很多人还是选择用手机导航?有5个原因...

提到导航&#xff0c;你首先会想到什么导航产品呢&#xff1f;如果是高德导航、百度导航之类的&#xff0c;那你主要用手机导航。但是如果除了高德导航和百度导航之外&#xff0c;你还能随口说出四维图新导航、凯立德导航&#xff0c;甚至是道道通导航之类的话&#xff0c;那你…

WebRTC Google的 BBR拥塞控制算法解析

正文之前,给出本文的图例: BBR的组成 bbr算法实际上非常简单,在实现上它由5部分组成: 1.即时速率的计算 计算一个即时的带宽bw,该带宽是bbr一切计算的基准,bbr将会根据当前的即时带宽以及其所处的pipe状态来计算pacing rate以及cwnd(见下文),后面我们会看到,这个即时…

javafx阴影_JavaFX技巧23:节省内存! 属性的阴影场

javafx阴影Java 8中引入的属性和属性绑定是非常有用的编程概念。 当您开发用户界面时&#xff0c;它们特别有用。 实际上&#xff0c;它们是如此有用&#xff0c;以至于开发人员成为所有事物都应该是属性而不是原始属性的想法的受害者。 不幸的是&#xff0c;他们很容易忘记诸如…

Leetcode 151. 翻转字符串里的单词

原题链接 题解思路&#xff0c;操作分解&#xff0c;先把整体翻转&#xff0c;然后使用双指针算法分割出单个单词再次进行翻转。 class Solution { public:string reverseWords(string s) {int k 0;//保存单词首字母位置for (int i 0; i < s.size(); i ) {if (s[i] )…

python斐波那契数列前20项_兔子繁殖问题带来的智商碾压:斐波那契数列趣谈

本文来自公众号&#xff1a;超级数学建模微信号 &#xff1a;supermodeling原文标题&#xff1a;斐波那契数列趣谈via 善科by BB一般认为斐波那契数列的提出是基于兔子的繁殖问题&#xff1a;如果一开始有一对兔子&#xff0c;它们每月生育一对兔子&#xff0c;小兔在出生后一个…

jboss使用_使用JBoss Cool Store的终极云零售指南

jboss使用我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 带有JBoss Cool Store的App Dev Cloud 我们从头到尾讨论了各个层次&#xff0c;但尚未为您提供除Red Hat Container Development Kit&#xff08;CDK&#xff09;之外的任何应…

python基础论文_北大博士Python学习笔记,Python基础语法总结,一篇文章带你入门...

image.png网上现在Python学习资料有很多&#xff0c;但是很杂。很多初学Python的朋友就不知道该怎么去抉择&#xff0c;那些是自己当下所需要的。刚好朋友是北大的博士&#xff0c;在IT行业也工作八年了。就把他学习Python的笔记做了一些整理写下了本文。这份资料非常纯粹&…

C++ 11 深度学习(四)结构、权限修饰符

1.struct struct MyStruct {int a;char b; }; struct默认权限为public,其中最重要的是涉及到结构体数据对齐。 数据对齐&#xff0c;1.数据对齐是指存在处理结构体成员时&#xff0c;成员在内存中的起始地址编码必须是成员类型字节的整倍数。2.要以结构体中最深层的基本数据…

C++ 11 深度学习(五)类型转换:static_cast dynamic_cast const_cast reinterpret_cast

四种cast 通用形式&#xff1a;强制类型转换名<type>(express) 强制类型转换名&#xff0c;以上四种 &#xff1b;type:想要转成成的目标类型 &#xff1b; express&#xff0c;需要转换的目标 static_cast 内置数据类型转换&#xff0c;具有继承关系的指针和引用&am…

小程序triggerevent 传参_微信小程序——无限递归的层次列表

——上礼拜踩的坑1、关于为什么不直接操作DOM对象&#xff1f;因为微信小程序里没有document对象。2、为什么坑了这多时间&#xff1f;因为之前看了个过期的帖子&#xff0c;完美避开了解决方案。下面进入正文&#xff0c;需求是在微信小程序里构造一棵文件树。3、解决思路定义…

java ab工具_(ab)使用Java 8 FunctionalInterfaces作为本地方法

java ab工具如果您正在使用更高级的语言&#xff08;例如Scala或Ceylon&#xff0c;甚至JavaScript&#xff09;进行编程&#xff0c;则“嵌套函数”或“本地函数”是您非常常见的习惯用法。 例如&#xff0c;您将编写诸如fibonacci函数之类的东西&#xff1a; def f() {def …

C++ 11 深度学习(六)智能指针综述

以下三种智能指针均为类模板 1.shared_ptr 共享指针 &#xff0c;多个指针指向同一个对象&#xff0c;最后一个指针被销毁时&#xff0c;这个对象会被释放。 2.week_ptr 是辅助shared_ptr工作的 3.unique_ptr 是独占式指针&#xff0c;同一时间只能有一个指针能指向该对象…

python的仿真效果好吗_Python SimPy 仿真系列 (1)

本系列文章旨在介绍 SimPy 在工业仿真中的应用。在物流行业/工厂制造业/餐饮服务业存在大量急需优化的场景&#xff0c; 例如&#xff1a;如何最优化快递分拣人员的排班表以满足双十一突发的快递件量如何估算餐厅在用餐高峰的排队时长估算特定工序下&#xff0c;工厂生产所需要…