K最近邻 (k-Nearest Neighbors,KNN) 算法是一种分类算法,也是最简单易懂的机器学习算法,没有之一。1968年由 Cover 和 Hart 提出,应用场景有字符识别、文本分类、图像识别等领域。该算法的思想是:一个样本与数据集中的k个样本最相似,如果这k个样本中的大多数属于某一个类别,则该样本也属于这个类别。还是直接讲例子最好懂,一直没找到好的例子,就改造了下Peter Harrington的《机器学习实战》中电影分类的例子,当然实际情况不可能这么简单,这里只是为了说明该算法的用法。

先准备下电影分类数据集(电影名称与分类来自于优酷网;镜头数量则纯属虚构):

序号

电影名称

搞笑镜头

拥抱镜头

打斗镜头

电影类型

1.

宝贝当家

45

2

9

喜剧片

2.

美人鱼

21

17

5

喜剧片

3.

澳门风云3

54

9

11

喜剧片

4.

功夫熊猫3

39

0

31

喜剧片

5.

谍影重重

5

2

57

动作片

6.

叶问3

3

2

65

动作片

7.

伦敦陷落

2

3

55

动作片

8.

我的特工爷爷

6

4

21

动作片

9.

奔爱

7

46

4

爱情片

10.

夜孔雀

9

39

8

爱情片

11.

代理情人

9

38

2

爱情片

12.

新步步惊心

8

34

17

爱情片

13.

唐人街探案

23

3

17

上面数据集中序号1-12为已知的电影分类,分为喜剧片、动作片、爱情片三个种类,使用的特征值分别为搞笑镜头、打斗镜头、拥抱镜头的数量。那么来了一部新电影《唐人街探案》,它属于上述3个电影分类中的哪个类型?用KNN是怎么做的呢?

首先,我们构建一个已分好类的数据集。

对于一个规模巨大的数据集,显然数据库是更好的选择。这里为了方便验证,使用Python的字典dict构造数据集。

movie_data = {"宝贝当家": [45, 2, 9, "喜剧片"],"美人鱼": [21, 17, 5, "喜剧片"],"澳门风云3": [54, 9, 11, "喜剧片"],"功夫熊猫3": [39, 0, 31, "喜剧片"],"谍影重重": [5, 2, 57, "动作片"],"叶问3": [3, 2, 65, "动作片"],"伦敦陷落": [2, 3, 55, "动作片"],"我的特工爷爷": [6, 4, 21, "动作片"],"奔爱": [7, 46, 4, "爱情片"],"夜孔雀": [9, 39, 8, "爱情片"],"代理情人": [9, 38, 2, "爱情片"],"新步步惊心": [8, 34, 17, "爱情片"]}

       第二步:计算一个新样本与数据集中所有数据的距离。

这里的新样本就是:"唐人街探案": [23, 3, 17, "?片"]。欧式距离是一个非常简单又最常用的距离计算方法。

其中x,y为2个样本,n为维度,xi,yi为x,y第i个维度上的特征值。如x为:"唐人街探案": [23, 3, 17, "?片"],y为:"伦敦陷落": [2, 3, 55, "动作片"],则两者之间的距离为:=43.42。

下面为求与数据集中所有数据的距离代码:

x = [23, 3, 17]
KNN = []
for key, v in movie_data.items():d = math.sqrt((x[0] - v[0]) ** 2 + (x[1] - v[1]) ** 2 + (x[2] - v[2]) ** 2)KNN.append([key, round(d, 2)])
print(KNN)

输出结果:

[['谍影重重', 43.87], ['伦敦陷落', 43.42], ['澳门风云3', 32.14], ['叶问3', 52.01], ['我的特工爷爷', 17.49], ['新步步惊心', 34.44], ['宝贝当家', 23.43], ['功夫熊猫3', 21.47], ['奔爱', 47.69], ['美人鱼', 18.55], ['夜孔雀', 39.66], ['代理情人', 40.57]]

       第三步:按照距离大小进行递增排序。

KNN.sort(key=lambda dis: dis[1])

输出结果:

[['我的特工爷爷', 17.49], ['美人鱼', 18.55], ['功夫熊猫3', 21.47], ['宝贝当家', 23.43], ['澳门风云3', 32.14], ['新步步惊心', 34.44], ['夜孔雀', 39.66], ['代理情人', 40.57], ['伦敦陷落', 43.42], ['谍影重重', 43.87], ['奔爱', 47.69], ['叶问3', 52.01]]

    第四步:选取距离最小的k个样本。

这里取k=5;

KNN=KNN[:5]

输出:[['我的特工爷爷', 17.49], ['美人鱼', 18.55], ['功夫熊猫3', 21.47], ['宝贝当家', 23.43], ['澳门风云3', 32.14]]

第五步:确定前k个样本所在类别出现的频率,并输出出现频率最高的类别。

labels = {"喜剧片":0,"动作片":0,"爱情片":0}
for sin KNN:label = movie_data[s[0]]labels[label[3]] += 1
labels =sorted(labels.items(),key=lambdal: l[1],reverse=True)
print(labels,labels[0][0],sep='\n')

输出结果:

[('喜剧片', 4), ('动作片', 1), ('爱情片', 0)]

喜剧片

KNN有几个特点:

(1)KNN属于惰性学习(lazy-learning)

这是与急切学习(eager learning)相对应的,因为KNN没有显式的学习过程!也就是说没有训练阶段,从上面的例子就可以看出,数据集事先已有了分类和特征值,待收到新样本后直接进行处理。

(2)KNN的计算复杂度较高

我们从上面的例子可以看到,新样本需要与数据集中每个数据进行距离计算,计算复杂度和数据集中的数据数目n成正比,也就是说,KNN的时间复杂度为O(n),因此KNN一般适用于样本数较少的数据集。

(3)k取不同值时,分类结果可能会有显著不同。

上例中,如果k取值为k=1,那么分类就是动作片,而不是喜剧片。一般k的取值不超过20,上限是n的开方。

 

K最近邻算法(KNN)相关推荐

  1. python机器学习案例系列教程——K最近邻算法(KNN)、kd树

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 K最近邻简介 K最近邻属于一种估值或分类算法,他的解释很容易. 我们假设一个人的优秀成为设定为1.2.3.4.5.6.7.8.9.10 ...

  2. 基于改进的k最近邻算法的单体型重建问题An Improved KNN Algorithm for Haplotype Reconstruction Problem

    基于改进的k最近邻算法的单体型重建问题 An Improved KNN Algorithm for Haplotype Reconstruction Problem DOI: 10.12677/csa ...

  3. KNN算法(K最近邻算法)详解

    K 最近邻的核心数学知识是距离的计算和权重的计算.我们把需要预测的点作为中心点,然后计算其周围一定半径内的已知点距其的距离,挑选前 k 个点,进行投票,这 k 个点中,哪个类别的点多,该预测点就被判定 ...

  4. 基于KD树的K近邻算法(KNN)算法

    文章目录 KNN 简介 KNN 三要素 距离度量 k值的选择 分类决策规则 KNN 实现 1,构造kd树 2,搜索最近邻 3,预测 用kd树完成最近邻搜索 K近邻算法(KNN)算法,是一种基本的分类与 ...

  5. 算法基础:k最近邻算法

    本博客所有内容均整理自<算法图解>,欢迎讨论交流~ 了解过机器学习这个概念,一定知道有一种名为k最近邻的算法,简称KNN. 对于k最近邻算法的定义,百度百科是这样给出的:K最近邻(k-Ne ...

  6. k近邻算法 (KNN)

    k近邻算法 k近邻算法(KNN,K-NearestNeighbor)是一种基本分类和回归方法,监督学习算法,本质上是基于一种数据统计的方法: 核心思想:给定一个训练数据集,对新的输入实例,在训练数据集 ...

  7. 机器学习:k邻近算法(KNN)

    title: 机器学习:k邻近算法(KNN) date: 2019-11-16 20:20:41 mathjax: true categories: 机器学习 tags: 机器学习 什么是K邻近算法? ...

  8. k近邻算法(KNN)-分类算法

    k近邻算法(KNN)-分类算法 1 概念 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. k-近邻算法采用测量不同特征值之间的 ...

  9. 01 K近邻算法 KNN

    01 K近邻算法 KNN k近邻算法基础 等价于 scikit-learn中的机器学习算法封装 训练数据集,测试数据集 分类准确度 超参数 考虑距离权重 更多关于距离的定义 搜索明可夫斯基距离相应的p ...

  10. KNN(K最近邻算法)的详细介绍

    KNN(最近邻算法)的最详细介绍 一.KNN算法的基本介绍 二.KNN算法的基本思想 三.基于sklearn实现KNN(基于iris数据) 四.非基于sklearn实现KNN(基于iris数据) 五. ...

最新文章

  1. Postgresql:删除及查询字段中包含单引号的数据
  2. 【Groovy】闭包 Closure ( 闭包作为函数参数 | 代码示例 )
  3. 树上有10只鸟,打死1只,还剩几只?答案太牛了!
  4. 基本程序 打印Scala的Hello World
  5. Java LinkedList void add(int index,Object o)方法,带示例
  6. 窗口限制文件上传格式
  7. MYSQL 5.7 INNODB 表空间
  8. oracle扩充undo,Oracle快速替换UNDO表空间方法
  9. 计算机考试数据库相关知识点,计算机等级考试四级数据库工程师知识点总结
  10. 【创建交互式 Dice Roller 应用】
  11. 操作系统实验七:动态分区分配方式的模拟
  12. pack文件如何安装
  13. 中位数、众数和均值的关系
  14. 用Excel或WPS做两独立样本的T检验
  15. VMware安装win10镜像
  16. 从零开始搭建Salt Web之初探salt-api
  17. TLS协议分析 (九) 现代加密通信协议设计
  18. vrchat模型保存_轻松简单自己上传VRChat的Avatar
  19. schannel: failed to receive handshake, SSL/TLS connection failed
  20. 【问题3】:Kaggle练习题《房价预测》----分别采用的岭回归,随机森林,bagging模型,AdaBoost,XgBoost等。

热门文章

  1. 985大学名单及分档排名分析
  2. 网络空间搜索引擎的区别
  3. 2021年安全员-C证(广西省-2021版)报名考试及安全员-C证(广西省-2021版)免费试题
  4. 杭州达内Web前端暑期培训day01
  5. 毕业设计 Stm32智能感应行李箱 - 单片机 物联网
  6. 最火爆ChatGPT知识星球分享,开启与GPT的神奇之旅
  7. 除夕放假,如愿以偿还是若有所失?
  8. linux配置服务器端frpc,linux centos下 手动搭建frpc客户端实现穿透内网。
  9. python把excel中所有的图表插入到word文件中
  10. 格式转换:BAM 转 FASTQ