1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 六大距离:欧式距离 街道距离 马氏距离等

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

时间:2018-08-02 18:12:46

相关推荐

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

文章目录

1 简 介2 距离特征2.1 Euclidean距离2.2 Cosine距离2.3 manhattan距离2.4 chebyshev距离2.5 minkowski距离2.6 mahalanobis距离 3 代 码实现

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 pltfrom sklearn.neighbors import DistanceMetricfrom sklearn.metrics.pairwise import cosine_similarity## 随机生成两个向量,vec1,vec2vec1 = 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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。