六大距离:欧式距离、街道距离、马氏距离等

2022-08-08 11:49:23

1 简 介

数值向量是数据建模问题中最为常见的一类特征,例如:
在一些涉及图片,文本信息等的场景中,例如图片相似度匹配查询、相似文章寻找、同款商品定位等等问题中,为了能快速进行搜索匹配,我们往往会都会将图片文本等信息转化为数值向量;
在搜索推荐等的多流程建模工作中,上游经常会将一些数值向量特征输送到下游,最常见的就是图片向量信息、上游各个模型的预测分数拼接而成的向量。
那么如何基于这些生成的向量继续加工构建更多有用的特征呢?方式有很多,例如聚类;求统计特征等等。本文将会介绍一类基于数值特征向量的一整套距离特征。

2 距离特征

2.1 Euclidean距离

欧几里得距离也就是两个数值向量点之间的长度,其数学公式如下:
在这里插入图片描述
从其数学公式上我们可以发现:

  • 欧几里得距离会受到数值向量的量纲大小的影响,所以最好在计算距离之前先对数据进行归一化处理;
  • 欧几里得距离在向量维度非常大的时候效果会大大下降;

2.2 Cosine距离

Cosine距离在高维度空间中往往会比欧几里得距离的效果要好很多,Cosine距离的数学计算形式如下:
在这里插入图片描述

从其数学公式上我们可以发现:

  • Cosine距离在计算的时候已经做了类似归一化的操作,所以我们无序在计算其之前再做归一化等预处理;
  • Cosine距离不会考虑向量的大小,所以两个向量及时同时缩放一定的倍数,计算得到的大小也是一样的;

2.3 manhattan距离

manhattan距离有时也被成为街道距离,因为它的计算方式有点类似于只能90度拐角的街道长度,manhattan距离在高维度的空间有的时候可以取得比欧几里得距离更好的效果,其对应的数学式子如下:
在这里插入图片描述

2.4 chebyshev距离

chebyshev距离是两个数值向量在单个维度上绝对值差值最大的那个值,chebyshev距离在一些较为特殊的场景中物理意义很大,

例如:我们现在需要组装一个物品,但是需要很多零件,每个零件在不同的地方,需要邮寄过来,这个时候chebyshev距离就是需要的最短时间;

chebyshev距离其对应的数学计算式如下:
在这里插入图片描述

2.5 minkowski距离

minkowski距离计算公式如下:
在这里插入图片描述

我们发现欧几里得距离,manhattan距离和chebyshev距离都是其特殊的例子,而minkowski距离最大的优势在于:

  • 我们可以调整p值的取值,在此基础上寻找最优的p值用于最终的预测。
  • 在进行距离计算之前,一般需要对向量进行归一化操作;

2.6 mahalanobis距离

Mahalanobis(马氏)距离可以看作是欧氏距离的一种修正,修正了欧式距离中各个维度尺度不一致且相关的问题。
其中

是多维随机变量的协方差矩阵,马氏距离在涉及到距离计算的问题中,都是非常不错的特征。

3 代 码实现

import pandas as pdimport seaborn as snsimport numpy as npimport matplotlib.pyplot as plt
from sklearn.neighborsimport DistanceMetric
from sklearn.metrics.pairwiseimport cosine_similarity## 随机生成两个向量,vec1,vec2
vec1= np.random.normal(size=1000)
vec2= np.random.normal(size=1000)

3.1 Euclidean距离

dist= DistanceMetric.get_metric('euclidean')
dist.pairwise([vec1,vec2])[0,1]

46.0531806254225

3.2 Cosine距离

cosine_similarity([vec1,vec2])[0,1]

-0.012651236859499773

3.3 manhattan距离

dist= DistanceMetric.get_metric('manhattan')
dist.pairwise([vec1,vec2])[0,1]

1165.7413956018454

3.4 chebyshev距离

dist= DistanceMetric.get_metric('chebyshev')
dist.pairwise([vec1,vec2])[0,1]

4.713077519584598

3.5 minkowski距离

dist= DistanceMetric.get_metric('minkowski',p=1)
dist.pairwise([vec1,vec2])[0,1]

1165.7413956018454

  • 作者:YJ语
  • 原文链接:https://blog.csdn.net/The_dream1/article/details/117626122
    更新时间:2022-08-08 11:49:23