KNN分类算法,是理论上比较成熟的方法,也是最简单的机器学习算法之一。

该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

一个对于KNN算法解释最清楚的图如下所示:

蓝方块和红三角均是已有分类数据,当前的任务是将绿色圆块进行分类判断,判断是属于蓝方块或者红三角。

当然这里的分类还跟K值是有关的:

如果K=3(实线圈),红三角占比2/3,则判断为红三角;

如果K=5(虚线圈),蓝方块占比3/5,则判断为蓝方块。

由此可以看出knn算法实际上根本就不用进行训练,而是直接进行计算的,训练时间为0,计算时间为训练集规模n。

knn算法的基本要素大致有3个:

  1、K 值的选择

  2、距离的度量

  3、分类决策规则


使用方式:(转载)

  1. K 值会对算法的结果产生重大影响。K值较小意味着只有与输入实例较近的训练实例才会对预测结果起作用,容易发生过拟合;如果 K 值较大,优点是可以减少学习的估计误差,缺点是学习的近似误差增大,这时与输入实例较远的训练实例也会对预测起作用,是预测发生错误。在实际应用中,K 值一般选择一个较小的数值,通常采用交叉验证的方法来选择最有的 K 值。随着训练实例数目趋向于无穷和 K=1 时,误差率不会超过贝叶斯误差率的2倍,如果K也趋向于无穷,则误差率趋向于贝叶斯误差率。
  2. 算法中的分类决策规则往往是多数表决,即由输入实例的 K 个最临近的训练实例中的多数类决定输入实例的类别
  3. 距离度量一般采用 Lp 距离,当p=2时,即为欧氏距离,在度量之前,应该将每个属性的值规范化,这样有助于防止具有较大初始值域的属性比具有较小初始值域的属性的权重过大。

knn算法在分类时主要的不足是,当样本不平衡时,如果一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的 K 个邻居中大容量类的样本占多数。

算法伪代码:

 1 搜索k近邻的算法:kNN(A[n],k)
 2
 3 #输入:A[n]为N个训练样本在空间中的坐标,k为近邻数
 4 #输出:x所属的类别
 5
 6 取A[1]~A[k]作为x的初始近邻,计算与测试样本x间的欧式距离d(x,A[i]),i=1,2,.....,k;
 7 按d(x,A[i])升序排序;
 8 取最远样本距离D = max{d(x,a[j]) | j=1,2,...,k};
 9
10 for(i=k+1;i<=n;i++)#继续计算剩下的n-k个数据的欧氏距离
11       计算a[i]与x间的距离d(x,A[i]);
12       if(d(x,A[i]))<D
13                then 用A[i]代替最远样本#将后面计算的数据直接进行插入即可
14
15  最后的K个数据是有大小顺序的,再进行K个样本的统计即可
16  计算前k个样本A[i]),i=1,2,..,k所属类别的概率;
17  具有最大概率的类别即为样本x的类

python 函数:

 1 #knn-k-最临近算法
 2 #inX为待分类向量,dataSet为训练数据集
 3 #labels为训练集对应分类,k最邻近算法
 4 def classify0(inX, dataSet, labels, k):
 5     dataSetSize = dataSet.shape[0]#获得dataSet的行数
 6
 7     diffMat = np.tile(inX, (dataSetSize,1)) - dataSet#对应的差值
 8     sqDiffMat = diffMat**2                           #差的平方
 9     sqDistances = sqDiffMat.sum(axis=1)              #差的平方的和
10     distances = sqDistances**0.5                     #差的平方的和的平方根
11     #计算待分类向量与每一个训练数据集的欧氏距离
12
13     sortedDistIndicies = distances.argsort() #排序后,统计前面K个数据的分类情况
14
15     classCount={}#字典
16     for i in range(k):
17         voteIlabel = labels[sortedDistIndicies[i]]#labels得是字典才可以如此
18         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
19
20     sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)#再次排序
21
22     return sortedClassCount[0][0]#第一个就是最多的类别

最后针对于K值的选取,做最后的总结:

转载于:https://www.cnblogs.com/yushuo1990/p/5879341.html

[机器学习] ——KNN K-最邻近算法相关推荐

  1. 第7-3课:K 最邻近算法(KNN)与手写数字识别

    K 最近邻(KNN,K-Nearest Neighbor)算法是一类在数据挖掘领域常用的分类算法,该算法看似神秘,其实原理很简单,算法实现也很简单.KNN 算法在类别决策时,只参考极少量的相邻样本,也 ...

  2. 如何利用 C# 实现 K 最邻近算法?

    众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问题.没有哪个电影人会说自己制作的 ...

  3. 如何利用 C# + KDTree 实现 K 最邻近算法?

    在本篇图文中,我们一步步地构造使用 K 最邻近分类器的手写识别系统. 为了简单起见,这里构造的系统只能识别数字 0 到 9,如下图所示.需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小, ...

  4. 机器学习之K均值(K-Means)算法

    1.K-Means简介 K均值(K-Means)算法是无监督的聚类方法,实现起来比较简单,聚类效果也比较好,因此应用很广泛.K-Means算法针对不同应用场景,有不同方面的改进.我们从最传统的K-Me ...

  5. k最邻近算法——加权kNN

    from:https://www.cnblogs.com/bigmonkey/p/7387943.html 加权kNN 上篇文章中提到为每个点的距离增加一个权重,使得距离近的点可以得到更大的权重,在此 ...

  6. 《算法图解》----第十章:K最邻近算法

  7. 【机器学习】K近邻算法(K-NearestNeighbors , KNN)详解 + Java代码实现

    文章目录 一.KNN 基本介绍 二.KNN 核心思想 三.KNN 算法流程 四.KNN 优缺点 五.Java 代码实现 KNN 六.KNN 改进策略 一.KNN 基本介绍 邻近算法,或者说K最邻近(K ...

  8. 课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)

    机器学习KNN算法手写数字识别系统 下载本文手写数字识别系统完整的代码和课设报告的链接(或者可以联系博主koukou(壹壹23七2五六98),获取源码和报告):https://download.csd ...

  9. 机器学习3—分类算法之K邻近算法(KNN)

    K邻近算法(KNN) 一.算法思想 二.KNN类KNeighborsClassifier的使用 三.KNN分析红酒类型 3.1红酒数据集 3.2红酒数据的读取 3.3将红酒的数据集拆分为训练和测试集 ...

最新文章

  1. linux 本地socket 简介
  2. java ee 中文乱码的问题
  3. 沙洋有几个微服务群_集群 分布式 微服务
  4. 分号与逗号的区别及举例_如何掌握分号的用法 和顿号有什么区别
  5. Linux平台下C++编程
  6. 领悟非凡,只有西方人才能做出来的效果。。。不是技术,而是人文和胸怀
  7. python使用ip代理抓取网页
  8. hashcode和equals方法详细解析, hashmap对于hashcode方法的使用
  9. 5000字彻底道尽「区块链分叉」真相!
  10. 地理加权回归简易总结
  11. ireader_使用iReader在Chrome和Firefox上获取Safari Reader
  12. python量化交易策略技巧与实战_量化交易策略基本框架
  13. 在哪能查到英文论文?
  14. 51单片机学习板,超声波模块学习
  15. 如何求有序数组绝对值最小的数
  16. python如何将秒数转化成时分秒_python时分秒化为秒 python时分秒的正则表达式
  17. 大一软件工程要学什么
  18. 拼插机器人课和围棋课_开学第一课和机器人比围棋的人是谁
  19. 开源“大地震”下,华为如何复制 Google 模式?
  20. SAP 深入理解销售订单

热门文章

  1. mysql 运算符转义_我的MYSQL学习心得(五) 运算符
  2. java批量上传文件_Spring Boot2(十四):单文件上传/下载,文件批量上传
  3. 中文分词与马尔科夫模型之二:隐马尔科夫模型与维特比
  4. ajax获取openid,异步环境下获取 openid的几个方法
  5. MySQL有sqldependency_SqlDependency的局限性是什么
  6. mybatis generator 中文注释_[SpringBoot2.X] 23- 整合持久层技术 -MyBatis - 配置
  7. mysql更新多条数据_mysql 一次更新多行(多条记录)
  8. Mysql binlog入门
  9. Windows核心编程_重绘ListBox样式(仿QQListBox)
  10. 朴素贝叶斯常见面试题