本博客所有内容均整理自《算法图解》,欢迎讨论交流~

了解过机器学习这个概念,一定知道有一种名为k最近邻的算法,简称KNN。

对于k最近邻算法的定义,百度百科是这样给出的:K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

通俗来说,就是近朱者赤,近墨者黑的道理。在有标签的监督学习中,k最近邻一般用于分类,即根据与某一个特征点离得最近的k个点的分类来决定该点的分类,一般是少数服从多数的决策;而在无标签的无监督学习中,k最近邻一般用于聚类,即将某点及与其离得最近的k个点聚到同一个类别中。不过话是这么说,一般对于无监督学习,人们通常使用的是K-Means算法,即k均值算法。


1、分类问题

对于KNN算法的应用,我们首先来看一个例子。

对于下面的这个水果,我们如何判断它具体是哪一个品种呢?

当然,理论上来说,我们必须根据生活经验才能做出判断,我们知道,类似于图中水果的形状和色泽的水果有橙子和柚子,同时我知道,柚子通常比橙子更大,更红。

所以我的脑子里有了如下所示的图表:

所以根据这个图表,以及上图中的水果又大又红的特点,我判断该水果很可能是柚子!

这并不难,但是下面这样的水果呢?

这个水果的大小和色泽都趋近于平庸,不大不小,不红不橙。

那么问题来了,我们如何判断这个水果的品种呢?

试想一下生活中的经验,对于一个陌生人,我们如何判断这个人的职业呢?我们一般会根据这个人的朋友来判断,如果这个人的朋友都是什么科学家啊工程师啊之类的,我们就认为这个人很可能是一个科研工作者;而如果这个人的朋友大多是什么记者啊播音员啊导演啊之类的,我们就认为这个人很可能是一个新闻传媒工作者。

这是自然而然的事情,但是这个自然而然的判断思路,其实就是k最近邻算法。

我们回到上面的问题,要判断图中水果的品种,我们就来看它的“朋友”,当然,这里我们把它的“朋友”称为“邻居”。

我们来看看离它最近的三个邻居:

如图所示,在离它最近的三个邻居中,有两个是橙子,有一个是柚子,所以根据投票法(其实就是少数服从多数)的决策,我们认为这个水果是一个橙子。在这里我们选择了3个邻居,所以我们使用的是3最近邻算法,其实k最近邻算法的k就是指的选择几个邻居来判断。


2、创建推荐系统

现在我们来看一个更加深入的例子。

假设你是Netflix,要为用户创建一个电影推荐系统。从本质上来说,这个问题其实非常类似于上面的水果分类问题!

我们首先可以对所有用户创建一个类似于上面橙子和柚子一样的图表:

这些用户在图表中的位置取决于其电影口味,所以电影喜好相似的用户之间距离比较近。假设你要向网名为“小兔子”的用户推荐电影,可以找出五位与他最接近的用户。

在找出了这五位距离最近的用户之后,我们只需要在这五位用户喜欢的电影中选择几部推荐给“小兔子”,就很可能“小兔子”会喜欢我们推荐的这些电影。

所以基于同样的道理,我们只需要根据这样的电影喜好图表就可以创建一个很好的推荐系统。


3、特征抽取

看了上面两个例子之后,问题来了,我们确实可以基于上面的水果图表和电影喜好图表来进行水果的分类和电影推荐系统的创建,但是,我们怎么知道图表中两点之间的距离呢?又怎么确定两位用户对于电影的喜好相似程度呢?

在前面的水果示例中,我们根据水果的大小和颜色来判断品种,其实这里的大小和颜色就是两个特征。我们最终依靠的就是这些特征来完成距离的度量和相似程度确定。

现在假设有三个水果,我们可以抽取它们的特征。

再根据这些特征画图。

从上图来看,哪怕没有标签,我们也可以大胆预测,水果A和水果B极有可能是同一个品种,而水果C则是另外的品种。其实这就是使用KNN来进行聚类。

要计算两点的距离,我们使用毕达哥拉斯公式。

这样求出来的结果被称为欧几里得距离。

基于上面的毕达哥拉斯公式,我们可以求出图中A,B,C三点的两两之间的欧几里得距离。

这个距离结果印证了我们之前的直觉预测:A和B很像,而C则很不同。

如果我们有标签,如:横坐标值和纵坐标值都较小的水果是橙子,而横坐标值和纵坐标值都较大的水果是柚子,那么根据上图三点的位置和彼此之间的距离,我们就可以大胆猜测A和B是橙子,而C是柚子了。

现在我们再来看看推荐系统。对于推荐系统,我们需要比较的Netflix用户,所以就需要以某种方式将他们放到图表中去。因此,我们需要将每位用户都转换为一组坐标,就像之前对水果所做的那样。

转换成坐标之后,我们就可以把用户转换成坐标轴中的一个点了。当这些用户都抽象成一个点之后,我们就可以根据毕达哥拉斯公式来计算它们彼此之间的距离了。

但是我们如何将用户转换成坐标呢?下面是一种很直观的方式:用户注册时,我们就要求每一位注册新用户指出他们队各种电影的喜爱程度。这样,对于每位用户,我们就拥有一组数字了!

假设其中数字从1~5,数字越大表示越喜欢,数字越小表示越讨厌。

所以,我们从上面的图表可以看出,Priyanka和Justin都喜欢爱情片和生活片,讨厌恐怖片;而Morpheus喜欢动作片,讨厌爱情片和生活片。

前面判断水果是橙子还是柚子时,我们对每种水果都用2个数字来表示,分别代表大小和形状。而这里,我们有5个特征,所以每位用户都使用5个数字来表示。

于是,对于计算各个用户之间的相似程度,我们依然可以使用毕达哥拉斯公式,只不过不是二维的版本,而是五维的版本。

对于二维的情况,我说过毕达哥拉斯公式计算的是两个点之间的欧几里得距离,那么对于五维的版本呢?其实这时候计算获得的依然是距离,只是我们无法从直观上感受五维空间的距离,所以我们一般把这种距离称为相似程度。

根据计算,Priyanka和Justin之间的距离为2,而Priyanka和Morpheus之间的距离为。所以很明显,Priyanka的喜好更接近于Justin。

所以我们就可以轻松地创建一个针对于Priyanka的推荐系统了,只要是Justin喜欢的电影,我们就将其推荐给Priyanka,反之亦然。

所以这也提醒了我们,当你注册了Netflix之后,Netflix总是会不断提醒你:多给电影评分吧!其实这是因为你评论的电影越多,Netflix就越能较准确地判断出你哪些用户类似,所以给你的推荐就越符合你的胃口了。


4、回归问题

前面介绍的都是离散点的分类问题,接下来我们来看看连续点的回归问题。

假设你不仅要向Priyanka推荐电影,还要预测他将给某一部电影打多少分,怎么来解决这个问题呢?

首先,我们找出与他最近的5个用户,假设为Justin,JC,Joey,Lance和Chris。

现在你要预测Priyanka会给电影Pitch Perfect打多少分,我们就来先看看Priyanka的最近的五个邻居给这部电影打了多少分。

有了这些结果之后,我们对这些人打的分求平均,结果为4.2。这就是你预测的Priyanka将给这部电影打的分数。因为这个值不是一个离散值,例如我们求出的最终平均结果有可能是这样的值,所以是连续的,因而这是一个回归问题。

KNN主要就是可以做两个基本工资——分类和回归:

  • 分类:一般而言就是编组。
  • 回归:一般而言就是预测出一个数字,可以是小数甚至无穷小数。

回归也很有用。假设你经营着一家面包店,每天都做新鲜面包,需要根据如下一组特征来预测当天该烤多少条面包才能效益最大化:

  • 天气指数,1~5,1表示天气很糟,5表示天气很好。
  • 是否是周末或节假日,如果是则为1,否则为0。
  • 有没有活动,有活动为1,无活动为0。

你还有一些历史数据,记录了在各种天气指数、周末或节假日或普通日以及有活动或无活动的日子里售出的面包数量。

而今天是周末,天气不错,是否有活动未知。

根据以上信息,我们如何预测今天能售出多少条面包呢?使用KNN!

首先,我们定义算法中的K的值为4,其实K的值为多少一般来说根据经验来定,当然也可以多次迭代来计算出最优K值,也可以让K取不同值然后根据结果的后验概率来确定K值,这些都是更加复杂的内容了。后面也会讲到普通情况下的K值选取。

总之在这里,为解决预测面包的问题,我们就规定了找出最接近的4个邻居。

将今天的数组(4,1,)与前面的6个历史数据进行对比,计算它们6个数据与今天的数据之间的距离,如下图所示:

选出其中距离最近的4个,A,B,D,E。将这4天售出的面包数进行平均,结果为218.75。这就是你今天要烤的面包数!


5、计算距离的公式

前面计算两位用户的距离时,我们都是使用的毕达哥拉斯距离公式。其实有时候,该公式不一定最适用。

试想下面的情况,有两位品味非常类似的用户,但其中一位打分时更谨慎,比如说,他们都喜欢《哈利波特》,但Paul给了5星,而Rowan却只给了4星。其实Rowan一样非常非常喜欢《哈利波特》,只是他打分过于保守,可能他就打过的最高分就是4星了,这种情况下,如果你使用毕达哥拉斯距离公式去计算距离,可能Paul和Rowan就不是邻居了,但其实他们的口味非常类似。

上面的情况其实在实际生活中屡见不鲜,所以在实际工作中,我们经常使用余弦相似度来计算两位用户之间的距离。

余弦相似度不计算两个矢量的距离,而比较它们的角度,因此更适合处理前面所说的情况。

具体有关余弦相似度的内容这里不再详述,请参考余弦相似度的百度百科。

另外,还有一种有效的方法是使用皮尔逊相关系数来评价。如果某人总是倾向于给出比另一个人更高的分值,而二者的分值之差又始终保持一致,则他们依然可能会存在很好的相关性。这就是皮尔逊相关系数的优点所在。

皮尔逊相关系数的计算公式如下所示:

有关皮尔逊相关系数的具体内容请参考皮尔逊相关系数的百度百科。


6、挑选合适的特征

其实,还有一个非常影响结果的事情,那就是挑选的特征。

对于上面的水果分类问题,我们根据一个水果的大小和颜色来判断它是橙子还是柚子,那是因为我们挑选了“大小”和“颜色”这两个特定的特征来进行判断的,但如果我们挑选的特征是“形状”和“重量”呢?

那完了,对于一个橙子和一个柚子,可能都是球形的,然后重0.5kg,这两个特征根本无法判断一个水果是橙子还是柚子。

又假设你只让用户给《玩具总动员》《玩具总动员2》和《玩具总动员3》评分,这就根本无法将用户的电影欣赏品味体现出来!

所以进行KNN时,挑选合适的特征进行比较至关重要

所谓合适的特征,必须要有以下几个特点:

  • 与要进行的分类或回归紧密相关的特征(例如,要预测水果的品种,就不要挑选今天是晴天还是雨天这种不相关的特征)。
  • 不偏不倚的特征(例如,如果只让用户给喜剧片打分,就无法判断他们是否喜欢动作片)。
  • 有区分度的特征(例如,要判断是橙子还是柚子,就不要选择“形状”作为特征,因为这两种水果都是球形的)。

对于挑选合适的特征,上面的三个特点也只是一些普适情况,根本就没有放之四海皆准的法则,必须在实际工作中考虑到各种因素,综合做出选择。


7、K值的经验选取

上面说到预测售出面包数量的例子时,我很暴力地选择了4作为K的值,即找出最近的4个邻居。

那么对于K值的选取,其实是一门很复杂的技术。前面讲到了,可以迭代最优,可以使用后验概率最优,甚至可以使用极大似然函数作为选取准则。

但是在这样一个K值选取的步骤上就花费这么大心血显得有些本末倒置了。 一般来说,K值的选取不会太大程度地影响最终的结果,只要选择好了特征,选择好了计算距离的公式,得到的结果就不会太坏。

而且,更何况我们还可以先随便选一个K值,根据最后得出的结果的好坏来修正K的取值。这样一定是可以得到最佳的K值的。

其实根据经验来说,对于总共有N个数据可供使用,即我们根据N个用户的评分情况来预测Priyanka对某部电影的评分,一般来说我们会选择sqrt(N)(即)来作为K的值。

算法基础:k最近邻算法相关推荐

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

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

  2. 机器学习算法基础——k近邻算法

    23.k-近邻算法以及案例预测入住位置 24.K-近邻算法案例 分类算法-k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本 ...

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

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

  4. 分类算法python程序_分类算法——k最近邻算法(Python实现)(文末附工程源代码)...

    kNN算法原理 k最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法.它采用测量不同特征值之间的距离方法进行分类,思想很简单:如果一个样本在特征空间中的k个最近邻(最相似)的样 ...

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

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

  6. k均值算法 二分k均值算法_如何获得K均值算法面试问题

    k均值算法 二分k均值算法 数据科学访谈 (Data Science Interviews) KMeans is one of the most common and important cluste ...

  7. 《算法基础:打开算法之门》一1.5 拓展阅读

    本节书摘来自华章出版社<算法基础:打开算法之门>一书中的第1章,第1.5节,作者 [美]托马斯 H 科尔曼(Thomas H Cormen),更多章节内容可以访问云栖社区"华章 ...

  8. k均值算法 二分k均值算法_使用K均值对加勒比珊瑚礁进行分类

    k均值算法 二分k均值算法 Have you ever seen a Caribbean reef? Well if you haven't, prepare yourself. 您见过加勒比礁吗? ...

  9. KNN算法(K临近算法)及使用KNN算法实现手写数字0-9识别

    首先感谢博主倔强的小彬雅,本文使用的素材及部分代码来源其博文机器学习入门-用KNN实现手写数字图片识别(包含自己图片转化),需要下载素材的可以到其博文最后进行下载. 关于KNN算法 knn算法也叫K临 ...

最新文章

  1. 【机器视觉案例】(9) AI视觉,手势控制电脑键盘,附python完整代码
  2. Ansible playbook 备份Cisco ios 配置
  3. android之inflater用法
  4. java用if判断输入字符_java怎么用if判断输入的是不是数字
  5. mac safari无法连接服务器_宇航员乘坐SpaceX飞船返航中iPad上Safari出现“无法连接到网络”错误...
  6. 在Controller中使用AOP
  7. xutils找id空指针_xUtils更新到3.0后的基本使用规则
  8. Java 集合系列16之 Spring Boot 配置文件 选项配置(一)
  9. 报错:非介入式客户端验证规则中的验证类型名称必须唯一。下列验证类型出现重复...
  10. Linux tcpdump命令详解
  11. Vue 项目更新,浏览器不需强制刷新就可更新版本! 防止缓存
  12. 张量(五):张量学习——BGCP
  13. APP优化 启动速度优化
  14. 手机版本android升级包下载,ColorOS8.0升级包下载安装-oppo手机系统ColorOS8.0正式版升级包下载 安卓版 v1.0- 游娱下载站...
  15. 学计算机基础专业必备的书,大学计算机基础教程
  16. “企业上云”计划出炉,三年内河北万家企业要上云!|中机智库
  17. 在deepin20.6上运行ros和far planner
  18. java并发编程实战wwj----------------------第一阶段--------------27-28-29-30
  19. 5G智慧医疗十大应用场景,你知道多少?
  20. 计算机二级2017试题及答案,2017计算机二级VF试题及答案

热门文章

  1. 信号处理--常用术语
  2. 编译安装Linux内核(以5.10.104版本为例)
  3. Vue一个案例引发「内容分发slot」的最全总结
  4. 领航优配|累计分红超300亿元,外资持续加仓,云计算龙头再拉涨停
  5. 电脑桌面图标变白恢复方法
  6. 公司上市需要具备的条件有哪些
  7. JSON Parse error:Unrecognized token xxx
  8. linux机械硬盘提速,这几招提升机械硬盘速度的技巧连老师傅都不一定知道
  9. autoware.auto安装教程
  10. php 提取视频中的声音,怎么提取视频的声音 提取视频中的声音