算法原理


K最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法。它采用测量不同特征值之间的距离方法进行分类。它的思想很简单:如果一个样本在特征空间中的k个最近邻(最相似)的样本中的大多数都属于某一个类别,则该样本也属于这个类别。第一个字母k可以小写,表示外部定义的近邻数量。

举例说明


首先我们准备一个数据集,这个数据集很简单,是由二维空间上的4个点构成的一个矩阵,如表1所示:

表1:训练集

其中前两个点构成一个类别A,后两个点构成一个类别B。我们用Python把这4个点在坐标系中绘制出来,如图1所示:

图1:训练集绘制

绘制所用的代码如下:

# -*- encoding:utf-8-* -
from numpy import *
import matplotlib.pyplot as pltdef createDataSet():dataSet = array([[1.0, 1.1], [1.0, 1.0], [0, 0.2], [0, 0.1]])  # 数据集labels = ['A', 'A', 'B', 'B']  # 数据集对应的类别标签return dataSet, labelsdataSet, labels = createDataSet()
# 显示数据集信息
fig = plt.figure()
ax = fig.add_subplot(111)
indx = 0
for point in dataSet:if labels[indx] == 'A':ax.scatter(point[0], point[1], c='blue', marker='o', linewidths=0, s=300)plt.annotate("("+str(point[0])+","+str(point[1])+")", xy=(point[0], point[1]))else:ax.scatter(point[0], point[1], c='red', marker='^', linewidths=0, s=300)plt.annotate("("+str(point[0])+","+str(point[1])+")", xy=(point[0], point[1]))indx += 1
plt.show()

从图形中可以清晰地看到由4个点构成的训练集。该训练集被分为两个类别:A类——蓝色圆圈,B类——红色三角形。因为红色区域内的点距比它们到蓝色区域内的点距要小的多,这种分类也很自然。
下面我们给出测试集,只有一个点,我们把它加入到刚才的矩阵中去,如表2所示:

表2:加入了一个训练样本

我们想知道给出的这个测试集应该属于哪个分类,最简单的方法还是画图,我们把新加入的点加入图中,图2很清晰,从距离上看,它更接近红色三角形的范围,应该归于B类,这就是KNN算法的基本原理。

图2:加入一个训练样本后绘制

在上述代码的基础上,绘制测试样本点的代码如下:

# 显示即将需要测试的数据信息
testdata = [0.2, 0.2]
ax.scatter(testdata[0], testdata[1], c='green', marker='^', linewidths=0, s=300)
plt.annotate("(" + str(testdata[0]) + "," + str(testdata[1]) + ")", xy=(testdata[0], testdata[1]))
plt.show()

算法实现


综上所述,KNN算法应由以下步骤构成。
第一阶段:确定k值(就是指最近邻居的个数)。一般是一个奇数,因为测试样本有限,故取值为3。
第二阶段:确定距离度量公式。文本分类一般使用夹角余弦,得出待分类数据点和所有已知类别的样本点,从中选择距离最近的k个样本。
夹角余弦:

第三阶段:统计这k个样本点中各个类别的数量。上例中我们选定k值为3,则B类样本(三角形)有2个,A类样本(圆形)有 1个,那么我们就把这个方形数据点定位B类;即,根据k个样本中数量最多的样本是什么类别,我们就把这个数据点定为什么类别。

实现代码如下:

from numpy import *
import operator# 产生数据集
def createDataSet():dataSet = array([[1.0, 1.1], [1.0, 1.0], [0, 0.2], [0, 0.1]])  # 数据集labels = ['A', 'A', 'B', 'B']  # 数据集对应的类别标签return dataSet, labels# 夹角余弦距离公式
def cosdist(vector1, vector2):return dot(vector1, vector2) / (linalg.norm(vector1) * linalg.norm(vector2))# KNN 分类器
# 测试集:testdata; 训练集:trainSet;类别标签:listClasses;k: k个邻居数
def classify(testdata, trainSet, listClasses, k):dataSetSize = trainSet.shape[0]  # 返回样本集的行数distances = array(zeros(dataSetSize))for indx in xrange(dataSetSize):   # 计算测试集与训练集之间的距离:夹角余弦distances[indx] = cosdist(testdata, trainSet[indx])# 根据生成的夹角余弦按从小到大排序,结果为索引号sortedDistIndicies = argsort(distances)classCount = {}for i in range(k):# 按排序顺序返回样本集对应的类别标签voteIlabel = listClasses[sortedDistIndicies[i]]# 为字典classCount赋值,相同的key,value加1classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1# sorted():按字典值进行排序,返回listsortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]# dataSet:测试数据集
# labels:测试数据集对应的标签
dataSet, labels = createDataSet()
testdata = [0.2, 0.2]
k = 3   # 选取最近的K个样本进行类别判定
# 判定testdata类别,输出类别结果
print "label is: " + classify(testdata, dataSet, labels, k)

输出:“label is: B“

K近邻(K Nearest Neighbor-KNN)原理讲解及实现相关推荐

  1. 机器学习之重点汇总系列(二)——K近邻算法(k-Nearest Neighbor,kNN)

    什么是K近邻算法 引例 假设有数据集,其中前6部是训练集(有属性值和标记),我们根据训练集训练一个KNN模型,预测最后一部影片的电影类型 首先,将训练集中的所有样例画入坐标系,也将待测样例画入 然后计 ...

  2. K近邻(k-Nearest Neighbor,KNN)算法,一种基于实例的学习方法

    1. 基于实例的学习算法 0x1:数据挖掘的一些相关知识脉络 本文是一篇介绍K近邻数据挖掘算法的文章,而所谓数据挖掘,就是讨论如何在数据中寻找模式的一门学科. 其实人类的科学技术发展的历史,就一直伴随 ...

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

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

  4. k近邻法: k-nearest neighbor

    KNN k近邻算法既可以作为分类方法(离散的标签)也可以作为回归方法(连续标签).考虑作为分类的时候,算法的输入为特征空间,输出为实例的类别. 基本思想:给定一个训练集,然后寻找其中与新输入的实例最近 ...

  5. K近邻法算法(KNN)及其R实现

    1. K近邻算法 输入:训练数据集 T={(x1,y1),(x2,y2),⋯,(xN,yN)} T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\} 其中, xi∈χ⊆ ...

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

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

  7. 机器学习-监督学习之分类算法:K近邻法 (K-Nearest Neighbor,KNN)

    目录 KNN概述 举个例子: K值选取 距离计算 曼哈顿距离,切比雪夫距离关系(相互转化) k-近邻(KNN)算法步骤 相关代码实现 简单实例:判断电影类别 创建数据集 数据可视化 分类测试 运行结果 ...

  8. 《机器学习实战》——kNN(k近邻算法)

    原作者写的太好了,包括排版都特别整齐(其中有一个错误之处就是在约会网站配对效果判定的时候,列表顺序不对,导致结果有误,这里我已做出修改) 原作者和出处:http://blog.csdn.net/c40 ...

  9. 【模式识别】实验二:K近邻算法(KNN)

    KNN是模式识别中的经典算法,本次实验就MNIST数据集来做KNN算法的实验,并结合前一次的LDA降维对数据进行进一步处理. 实验报告图片版 pdf版本可以戳这:模式识别实验报告:KNN K近邻算法 ...

最新文章

  1. 请求异步js,请求完成后执行代码
  2. randn--创建正态分布随机矩阵
  3. vs 正则表达式替换
  4. springmvc中@PathVariable和@RequestParam的区别
  5. 最真实的办公自动化案例!
  6. 【人工智能导论】A*算法求解15数码问题 Java
  7. linux分区问题,调整linux分区问题
  8. 201912-4 区块链(CCF CSP认证)
  9. pip 离线安装_安装不上python的模块怎么办?别怕,我这有妙招!
  10. 「mac操作指南」WidsMob HEIC将HEIC/HEIF 转换为 JPEG/PNG/TIFF格式
  11. java移位操作示例
  12. 校外用Cterm登陆郁金香的方法
  13. C++实现模板方法模式--问卷调查实战
  14. python 输入整数数组_Python 2中的整数数组输入
  15. js通过开始时间和结束时间计算出中间的所有日期
  16. haproxy配置timeout
  17. QT如何实现二级下拉菜单(Combo box)
  18. 比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!
  19. 2021年全球与中国临时起搏器行业市场规模及发展前景分析
  20. 无领导小组讨论面试真题解析(十一)—— 面包与记者

热门文章

  1. AE PR模板基本图形预设素材包动态字幕文字标题排版动画预设效果
  2. 如何用Deep Learning为股票定价
  3. C++源代码单词扫描程序(词法分析)
  4. php 7编译安装mysql5.6_CentOS7上编译安装MySQL5.6.23_MySQL
  5. 华为android截屏快捷键,华为手机怎么截屏快捷键是什么
  6. (附源码)计算机毕业设计SSM旅游足迹分享系统
  7. java swing paint_Java Paint未在Swing中绘制
  8. 用Android手机充当台式电脑的摄像头、麦克风和音箱
  9. 抖音小店最新招商入驻标准及资质要求是什么
  10. RabbitMQ 延迟队列和消息可靠传递