一、kNN(k-nearest neighbor)算法原理

事物都遵循物以类聚的思想,即有相同特性的事物在特征空间分布上会靠得更近,所以kNN的思路是:一个样本在特征空间中k个靠的最近的样本中,大多数属于某个类别,这个样本就属于某个类别。

如图所示,蓝色方框和橙色三角分别代表不同的类别,此时来了一个未知类别的样本绿色圆,如何判断绿圆的类别,步骤如下:

  1. 计算绿圆和特征空间中的每一个点的距离。
  2. 设定k的值。
  3. 选取与当前绿圆距离最近的k个点。
  4. 统计前k个点所在的类别出现的频率。
  5. 返回出现频率最高的类别作为绿圆的预测类别。

如果k=3,则距离绿圆最近的三个点是黑色实线圆圈里的点,而橙色三角个数最多,故判断绿圆的类别是橙色三角。

如果k=5,则距离绿圆最近的5个点是黑色虚线圆圈里的点,此时蓝色方框个数最多,故判断绿圆的类别是蓝色方框。

样本点之间距离的一般使用欧氏距离来计算:

二、kNN算法python实现

  1. 计算各向量点之间的距离
  2. 选择距离最小的k个点
  3. 统计k个点中的类别,并从大到小排序
  4. 返回出现频率最高的类别

目前坐标中有两个黄点类和两个紫点类,需要判断蓝点属于哪个类别?

from numpy import *
import operator # knn algorithm
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] # 将inX重复dataSetSize行,便于做向量计算
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistinces = sqDiffMat.sum(axis=1)
distinces = sqDistinces ** 0.5
# 以上求向量点之间的欧氏距离 # 从小到大返回距离的索引值
sortedDistIndicies = distinces.argsort()
# 创建一个字典,用来存放类别和出现的频次
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
# classCount.iteritems()={'A': 1, 'B': 2}
# 用classCount中iteritems的第二项作为比较的数值(类别的统计频次),然后对iteritems逆序排序
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0] def createDataSet():
group = array([[10, 11], [9, 8], [2, 3], [3, 1]])
labels = ['A', 'A', 'B', 'B']
return group, labels if __name__ == '__main__':
group, labels = createDataSet()
classLabel = classify0([3.5, 2], group, labels, 3)
print "the classifier came back with: %c" % classLabel

返回的结果是:

the classifier came back with: B


参考资料:《机器学习实战》

机器学习之k-最近邻(kNN)算法的更多相关文章

  1. kNN算法:K最近邻(kNN,k-NearestNeighbor)分类算法

    一.KNN算法概述 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它 ...

  2. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

  3. K最近邻(KNN,k-Nearest Neighbor)准确理解

    K最近邻(KNN,k-Nearest Neighbor)准确理解 用了之后,发现我用的都是1NN,所以查阅了一下相关文献,才对KNN理解正确了,真是丢人了. 下图中,绿色圆要被决定赋予哪个类,是红色三 ...

  4. 机器学习-K近邻(KNN)算法详解

    一.KNN算法描述   KNN(K Near Neighbor):找到k个最近的邻居,即每个样本都可以用它最接近的这k个邻居中所占数量最多的类别来代表.KNN算法属于有监督学习方式的分类算法,所谓K近 ...

  5. day-9 sklearn库和python自带库实现最近邻KNN算法

    K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的 ...

  6. 理解KNN算法中的k值-knn算法中的k到底指的是什么 ?

    2019-11-09 20:11:26为方便自己收藏学习,转载博文from:https://blog.csdn.net/llhwx/article/details/102652798 knn算法是指对 ...

  7. python机器学习(2:KNN算法)

    1.KNN 简介:knn算法是监督学习中分类方法的一种.它又被叫k近邻算法,是一个概念极其简单而分类效果又很优秀的分类算法. 核心思想:在训练集中选出离输入的数据最近的k个数据,根据这k个数据的类别判 ...

  8. 机器学习实战---K均值聚类算法

    一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...

  9. 机器学习第一篇——最近邻kNN

    机器学习监督学习中,根据解决问题的连续性和离散型,分为分类问题和回归问题.最邻近算法kNN是一种最为直接和简便的分类方法. kNN本质上,是计算目标到模型的欧式距离,从而判定目标所属的类别. 首先,在 ...

  10. SVM(支持向量机)与统计机器学习 & 也说一下KNN算法

    因为SVM和统计机器学习内容很多,所以从 http://www.cnblogs.com/charlesblc/p/6188562.html 这篇文章里面分出来,单独写. 为什么说SVM和统计学关系很大 ...

随机推荐

  1. ansible-playbook快速入门

    一.yaml语法: 1. yaml语法编写 1.1 同层级的字段通过相同缩进表示 1.2 map结构里面key/value用‘:’来分隔 1.3 key/value可以同行写,也可以换行写,换行写必须 ...

  2. regex_match

    原型:bool regex_match(InputSequence[,MatchResults] , Regex[ , Flags]); 当模式匹配整个输入序列成功时,返回的是true,否则返回fal ...

  3. 优化升级logging封装RotatingFileHandler

    1.升级优化,提供用户自定义日志level文件夹生成控制,提供日志错误显示到日志打印异常补获到日志 # coding=utf-8 import logging import time import o ...

  4. Spring事务(三)事务增强器

    摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 目录 一.创建事务 1. 获取事务 2. 处理已经存在的事务 3. 准 ...

  5. Nginx代理

    Nginx 介绍:高性能的http服务器和反向代理(请求通过反向代理之后,访问服务器端的逻辑)如下图所示: Ningx的作用 负载均衡 所谓负载就是服务器各项技术所承受的压力 均衡,平均分配压力(物理 ...

  6. jQuery----jquery实现Tab键切换

    使用Jquery实现tab键切换,代码简洁易懂,实现逻辑清晰明了.具体总结如下: 需求分析: 鼠标进入tab切换模块,鼠标当前的模块上边框变为红色,并显示对应的商品名称.鼠标离开后,上边框恢复原色,图 ...

  7. 腾讯云Mac图床插件

    背景 随着博客越写越多,难免会遇到需要插入图片来说明的情况. 图床选择 首先调研了市面上的图床服务,本着稳定长期的目标,过滤掉了打一枪换一个地方的野鸡小网站,剩余比较靠谱的优缺点如下. 图床 优点 缺 ...

  8. Android ViewPager设置监听注意事项

    首先 implements View.OnClickListener 因为Item比较多用这个方便 设置监听要注意地方,如果在 onCreate 直接 findViewById布局里的ID是会出错的 ...

  9. HDFS上传数据的流程

    1.当客户端输入一条指令:hdfs dfs -put text.txt /text时,这条命令会给到DistributeFileSystem. 2.通过DistributeFileSystem简称DF ...

  10. JavaWeb基础—Http协议

    一.什么是Http协议 超文本传输协议的简称,用于定义客户端与web服务器通迅的格式. 关于[标准的HTTP协议是无状态的],请参见:http://www.cnblogs.com/bellkosmos ...