《图解算法》-10 K最邻近算法与距离计算

本文介绍K最邻近算法(KNN)的应用场景及局限性。通过水果识别例子引入,阐述在推荐系统中特征抽取和回归的应用,还介绍了欧氏距离、曼哈顿距离等常见距离计算公式及原理、优缺点,指出KNN可用于分类和回归,特征抽取对算法成败至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文属于《图解算法》系列。通过本篇,学习特征抽取、回归,了解K最邻近算法(k-nearest neighboursKNN)的应用场景及局限性。

一 水果识别例子

   比如有两种水果,柚子跟橙子。通常我们认为柚子比橙子更大,更红。

  

如果判断这个水果是橙子还是柚子呢?一种办法是看它的邻居。来看看离它最近的三个邻居。

  

二 推荐系统

这些用户在图表中的位置取决于其喜好,因此喜好相似的用户距离较近。假设你要向Priyanka 推荐电影,可以找出五位与他最接近的用户。

   

假设在对电影的喜好方面,Justin、JC、Joey、Lance和Chris都与Priyanka差不多,因此他们喜欢的电影很可能Priyanka也喜欢!

剩下的问题,就是如何确定用户的相似度?

2.1 特征抽取

   在前面的水果示例中,你根据个头和颜色来比较水果,换言之,比较的特征是个头和颜色.假设你有3个水果,

下面使用毕达哥斯拉公式,计算两个点距离 。

百科上定义:欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。

   二维空间的公式

其中,  为点  与点  之间的欧氏距离;  为点 到原点的欧氏距离。

说到距离,计算公式有很多。

  1. 欧氏距离
  2. 曼哈顿距离
  3. 切比雪夫距离
  4. 闵可夫斯基距离
  5. 标准化欧氏距离
  6. 马氏距离
  7. 夹角余弦。。。。

如果你跟我一样。对于数学一点也记不起来,一看公式就头大。那么这个欧式距离就是最容易理解的了。看到这里还不理解,我想起小学时候学的三角形:勾股定理。这个应该有印象吧。在平面画X,Y轴,随意两个点a,b。做虚线画出直角三角形找到C点。

可以推导出:

推导到多个维度。两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离:

再次强调一点,我们不是为了严格的学数学,而是为了更好的理解抽象的问题,不然即使证明“两点之间直线距离最短”也很复杂。就跟我上面画三角形来理解,都是不严谨的。

好了,回到水果的例子:

假设你要比较的是Netflix用户,就需要以某种方式将他们放到图表中。因此,你需要将每位用户都转换为一组坐标,就像前面对水果所做的那样。

这是PriyankaJustin的距离。

计算下距离:^{\sqrt{(3-4)^{2}+(4-3)^{2}+(4-5)^{2}+ (1-1)^{2}+ (4-5)^{2} }} =\sqrt{1+1+1+0+1} =2

同样:Priyanka和Morpheus的距离为^{\sqrt{24}}

上述距离表明,Priyanka的喜好更接近于Justin而不是Morpheus。只要是Justin喜欢的电影,就将其推荐给Priyanka,反之亦然。你这就创建了一个电影推荐系统!

2.2 回归

  假设你不仅要向Priyanka推荐电影,还要预测她将给这部电影打多少分。为此,先找出与她最近的几个人。人数不固定,这就是这种算法名为K最近邻的原因。

   假设你要预测Priyanka会给电影Pitch Perfect打多少分。Justin、JC、Joey、Lance和Chris都给它打了多少分呢?

  

你求这些人打的分的平均值,结果为4.2。这就是回归(regression)。你将使用KNN来做两项基本工作——分类和回归:

分类就是编组;

回归就是预测结果(如一个数字)。

上面的推荐系统是个实际中存在的应用,更加专业的描述为:基于邻域的推荐算法(User-Based CF和 和 Item-Based CF)。需要估算不同样本之间的相似性度量。而相似度的通常就是采用上面说的计算距离(distance)。下面接下来介绍写常见的计算距离的原理及适应场景。

三 常见公式

前面说的计算两个点的距离,使用了最简单的欧氏距离,基础的也是重要的参考标准。

缺点:比如说计算两个点的距离,点A(10,10000)、点B(1,500),第二个维度对于距离d的贡献是远远超过第一个维度的。在这里我们只是向量中的各个因素分别进行了处理,并没有考虑维度之间的相互关系,以及不同维度对于距离d的贡献程度

除此之外,简单列举下其他常见的其他公式:

曼哈顿距离(Manhattan Distance)

       从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。而这也是曼哈顿距离名称的来源, 曼哈顿距离也称为城市街区距离(City Block distance)

(1)二维平面两点a(x1,y1)与b(x2,y2)间的曼哈顿距离

对于曼哈顿距离相同的点,他们分布在同一横纵截距且截距相同的直线上。

优点: 比欧式距离考虑里实际的一些因素。

 缺点:跟欧式距离一样。

切比雪夫距离:

描述:在数学中,切比雪夫距离(Chebyshev distance)或是 L∞度量,是向量空间中的一种 度量,二个点之间的距离定义是其各坐标数值差绝对值的最大值

  

  国际象棋棋盘上二个位置间的切比雪夫距离是指王要从一个位子移至另一个位子需要走的步数。由于王可 以往斜前或斜后方向移动一格,因此可以较有效率的到达目的的格子。上图是棋盘上所有位置距 f6 位置的 切比雪夫距离。前面提到的欧氏距离只能直线走,而曼哈顿距离只能沿着划定的格子边缘走。这个就是两者的结合。

(1)二维平面两点a(x1,y1)与b(x2,y2)间的切比雪夫距离

即两坐标轴分别讨论差值取最大。对于切比雪夫距离相同的点,他们分布在以原点为中心的正方形边界上。

图中每一个正方形边界上的整点到原点的曼哈顿距离相同。

曼哈顿距离与切比雪夫距离的关系:

切比雪夫距离转曼哈顿距离,将每一个点(x,y)转化为( (x+y)/2,(x-y)/2)),新坐标系下的曼哈顿距离即为原坐标系下切比雪夫距离。
这个转化一般比较常用,曼哈顿距离一般可以通过排序前缀和的方式降低计算复杂度。方便理解,对照图可以认为曼哈顿坐标系是通过切比雪夫坐标系旋转45∘后,再缩小到原来的一半得到的。

这块的具体推导过程:参见https://www.cnblogs.com/SGCollin/p/9636955.html

可以理解为,比曼哈顿距离优化的方向更多了,从4个到8个。

闵可夫斯基距离(Minkowski Distance)

闵氏距离不是一种距离,而是一组距离的定义,是对多个距离度量公式的概括性的表述。

  • 闵氏距离定义:
  • 两个n维变量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

éµå¼è·ç¦»nç»´

其中p是一个变参数:

当p=1时,就是曼哈顿距离;

当p=2时,就是欧氏距离;

当p→∞时,就是切比雪夫距离。

因此,根据变参数的不同,闵氏距离可以表示某一类/种的距离。

闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点。

二维样本(身高,体重),其中身高范围是150~190,体重范围是50~60,有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。

来,闵氏距离的缺点主要有两个:(1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。(2)没有考虑各个分量的分布(期望,方差等)可能是不同的。

标准化欧氏距离 (Standardized Euclidean Distance)

 定义: 标准化欧氏距离是针对欧氏距离的缺点而作的一种改进。标准欧氏距离的思路:既然数据各维分量的分布不一样,那先将各个分量都“标准化”到均值、方差相等。假设样本集X的均值(mean)为m,标准差(standard deviation)为s,X的“标准化变量”表示为:

æ å忬§æ°è·ç¦»

标准化后的值 = ( 标准化前的值 - 分量的均值 ) /分量的标准差
经过简单的推导就可以得到两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的标准化欧氏距离的公式:

如果将方差的倒数看成一个权重,也可称之为加权欧氏距离(Weighted Euclidean distance)。

如果这里看起来吃力,那就推荐先看看这篇《期望、方差、标准差、标准化》

英语好的可以看看这篇,我觉得老外写的还是很认真的。在将一个概念前先举个例子,再讲公式。更容易理解。我自己在看的时候就有这种体会。

马氏距离(Mahalanobis Distance)

   这是基于协方差的推导,这里协方差的我忘了。需要看明白了在整理,不然提个公式过来也没有意义。

todo,待补充。

夹角余弦(Cosine)

前面说的距离计算,都是可以理解为空间坐标系中两个  ,计算的是位置上的距离。而余弦相似度是空间中的向量,是计算的方向的夹角。虽然都是为了计算相似度,但是从数学来看差别很大。

   待整理。

杰卡德相似系数(Jaccard similarity coefficient)

(1) 杰卡德相似系数
两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。

杰卡德相似系数是衡量两个集合的相似度一种指标。

(2) 杰卡德距离
与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)。杰卡德距离可用如下公式表示:

杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。

 

 

总结:

KNN用于分类和回归,需要考虑最近的邻居。

分类就是编组。

回归就是预测结果(如数字)。

特征抽取意味着将物品(如水果或用户)转换为一系列可比较的数字。

能否挑选合适的特征事关KNN算法的成败。

最后,数学真的重要。起码是入门的准备。你得知道有哪些方法,在结合具体的采集的数据去不断调整优化吧。

 

参考:

https://www.cnblogs.com/SGCollin/p/9636955.html

https://www.jianshu.com/p/aa9ea73eaf2d

https://zhuanlan.zhihu.com/p/25932717

http://blog.sina.com.cn/s/blog_407e5c1c0102vxyp.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bohu83

买个馒头吃

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值