[原]距离及相似度度量方法

标签: | 发表时间:2016-12-22 17:51 | 作者:shibing624
出处:http://blog.csdn.net/shibing624

前言

关于距离度量的方法的专题其实已经想做好久了,正好趁这个机会总结出来。

这里讨论的距离度量应该是向量空间内的度量,两个点(即两个向量)之间的距离或相似性的度量。每种度量包括描述、定义和公式、优缺点、应用等部分。

编辑距离:也叫Levenshtein距离,用来测量文本之间的距离。

1. 欧氏距离(Euclidean distance)

描述

这是最常见的两点之间距离度量表示法,即欧几里得度量。我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。

定义和距离公式

这里写图片描述

  • 二维平面上点a(x1,y1)与b(x2,y2)间的欧氏距离:

这里写图片描述

  • 三维空间点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离:
    这里写图片描述
    • n维空间点a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的欧氏距离(两个n维向量):
      这里写图片描述

即:所有点的对应维度之差的平方的求和再开方。

Python计算欧式距离

  import numpy
v1=[1 1]
v2=[2,2]
vec1=numpy.array(v1)
vec2=numpy.array(v2)
ist = numpy.linalg.norm(vec1 - vec2)

>>> ist
1.4142135623730951

2. 曼哈顿距离(Manhattan distance)

描述

根据维基百科, 曼哈顿距离的由来和定义如下:

曼哈顿距离的命名原因是从规划为方型建筑区块的城市(如曼哈顿)间,最短的行车路径而来(忽略曼哈顿的单向车道以及只存在于3、14大道的斜向车道)。任何往东三区块、往北六区块的的路径一定最少要走九区块,没有其他捷径。

这里写图片描述

曼哈顿距离也称为 城市街区距离(City Block distance),也就是在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的 投影的距离总和

曼哈顿距离其实就相当于两点在各个坐标轴上的投影距离之和。
如下图所示:

这里写图片描述

其中,绿线表示欧式距离,红、蓝、黄表示相等的曼哈顿距离。

定义和距离公式

  • 二维平面两点a(x1,y1)与b(x2,y2)间的曼哈顿距离:
    这里写图片描述

  • n维空间点a(x11,x12,…,x1n)与b(x21,x22,…,x2n)的曼哈顿距离:
    这里写图片描述

要注意的是,曼哈顿距离依赖坐标系统的转度,而非系统在坐标轴上的平移或映射。

3. 切比雪夫距离(Chebyshev distance)

描述

维基百科中, 切比雪夫距离的定义如下:

数学上,切比雪夫距离(Chebyshev distance)是向量空间中的一种度量,二个点之间的距离定义为其各座标数值差的最大值。

若将国际象棋棋盘放在二维直角座标系中,格子的边长定义为1,座标的x轴及y轴和棋盘方格平行,原点恰落在某一格的中心点,则王从一个位置走到其他位置需要的步数恰为二个位置的切比雪夫距离,因此 切比雪夫距离也称为棋盘距离

这里写图片描述

定义和距离公式

切比雪夫距离的距离公式如下:

二维平面两点a(x1,y1)与b(x2,y2)间的切比雪夫距离:
这里写图片描述

n维空间点a(x11,x12,…,x1n)与b(x21,x22,…,x2n)的切比雪夫距离:
这里写图片描述

4. 闵可夫斯基距离(Minkowski Distance)

描述

在书中提到,Lp距离即是Minkowski距离。闵氏距离不是一种距离,而是一组距离的定义。

在上面曼哈顿距离和切比雪夫距离中,都有提到过Lp距离。根据p取值的不同,闵式距离代表的含义也不同。我们来看一下闵式距离到底是什么距离度量方法。

闵可夫斯基距离并没有查到中文的维基百科词条,查阅英文wiki的。 Minkowski distance中,对Minkowski distance的定义如下:

The Minkowski distance is a metric on Euclidean space which can be considered as a generalization of both the Euclidean distance and the Manhattan distance.

是说,闵式距离是定义在欧几里得空间空间上的度量标准,可以被认为是欧氏距离和曼哈顿距离的推广。

The Minkowski distance can also be viewed as a multiple of the power mean of the component-wise differences between P and Q.

即是说,闵式距离可以看做p和q之间,所有元素的不同的幂平均。

定义和距离公式

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

这里写图片描述

也就是说,对p和q的各项之差的p次方求和后,开(1/p)次方。

维基百科中,给出了 p值不同的图形,如下:
这里写图片描述

图中清晰的展示了随着p值的增大,与原点的闵式距离为1的点的图形的演化过程。我们可以看到:

  • 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. 没有考虑各个分量的分布(期望,方差等)可能是不同的。

5. 标准化欧氏距离(Standardized Euclidean distance)

描述

标准化欧氏距离是针对简单欧氏距离的缺点而做的一种改进方案。
如前所述闵式距离的缺点,那么, 标准化欧氏距离的思路是:既然数据各维分量的分布不同,那么我先将各个分量都“标准化”到均值、方差相等,之后再进行度量。

定义和距离公式

假设样本集X的均值为m,标准差为s,那么样本集X的标准化过程用公式描述为:

X* = (X-m)/s

经过简单的推导,可以得到两个n维向量x(x1,…,xn)和y(y1,…,yn)之间的标准化欧式距离公式为:

这里写图片描述
如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(Weighted Euclidean distance)。

特点

优点:考虑了均值、方差,标准化了距离。

6. 马氏距离/马哈拉诺比斯距离(Mahalanobis Distance)

描述

在wiki的 Mahalanobis distance中介绍说:

The Mahalanobis distance is a descriptive statistic that provides a relative measure of a data point’s distance (residual) from a common point.

也就是说,马氏距离是提供了一个数据点与公共点之间的相对测量,它是一种描述性统计。

图的认识

这里写图片描述
上图有两个正态分布的总体,它们的均值分别为a和b,但方差不一样,则图中的A点离哪个总体更近?或者说A有更大的概率属于谁?

显然,A离左边的更近,A属于左边总体的概率更大,尽管A与a的欧式距离远一些。这就是 马氏距离的直观解释

定义和距离公式

概念:马氏距离是基于样本分布的一种距离。物理意义就是在规范化的主成分空间中的欧氏距离。所谓规范化的主成分空间就是利用主成分分析对一些数据进行主成分分解。再对所有主成分分解轴做归一化,形成新的坐标轴。由这些坐标轴张成的空间就是规范化的主成分空间。
这里写图片描述

定义:有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量X到u的马氏距离表示为:
这里写图片描述

而其中向量Xi与Xj之间的 马氏距离定义为:
这里写图片描述

若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式就成了:
这里写图片描述

则Xi与Xj之间的马氏距离等于他们的欧氏距离。即:若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。

欧式距离&马氏距离

这里写图片描述
这里写图片描述

马氏距离特点

  1. 量纲无关,排除变量之间的相关性的干扰
  2. 马氏距离的计算是 建立在总体样本的基础上的,如果拿同样的两个样本,放入两个不同的总体中,最后计算得出的两个样本间的马氏距离通常是不相同的,除非这两个总体的协方差矩阵碰巧相同;
  3. 计算马氏距离过程中,要求 总体样本数大于样本的维数,否则得到的总体样本协方差矩阵逆矩阵不存在,这种情况下,用欧式距离计算即可。

7.汉明距离(Hamming distance)

描述和定义

这里写图片描述
两个等长字符串s1与s2之间的汉明距离定义为: 将其中一个变为另外一个所需要作的最小替换次数。

举个栗子

字符串“1111”与“1001”之间的汉明距离为2。
The Hamming distance between “toned” and “roses” is 3.

应用

汉明距离计算在包括信息论、编码理论、密码学等领域都有应用。比如在信息编码过程中,为了增强容错性,应使得编码间的最小汉明距离尽可能大。但是, 如果要比较两个不同长度的字符串,不仅要进行替换,而且要进行插入与删除的运算,在这种场合下,通常使用更加复杂的编辑距离等算法。

其实,汉明距离应该算是编辑距离的一种特例(即只包括编辑操作中的“替换”操作)。


至此,前半部分主要考虑了两个向量(点)之间的距离度量,下面我们来看相似度度量。

8. 夹角余弦(Cosine)

描述

几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来 衡量样本向量之间的差异

定义和公式

  • 在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:
    这里写图片描述
  • 扩展到n维,则两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦为:
    这里写图片描述
    即:
    这里写图片描述

夹角余弦取值范围为[-1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。

应用

关于夹角余弦的应用可以参考吴军的数学之美系列。(数学之美12 - 余弦定理和新闻的分类)

9.相关系数 ( Correlation coefficient )

描述

相关系数是衡量随机变量X与Y相关程度的一种方法。
这里写图片描述

定义和公式

相关系数的取值范围是[-1,1]。相关系数的绝对值越大,则表明X与Y相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。

相关系数的公式为:
这里写图片描述

Python算法

  from numpy import *
a = array([1,2,3,4,6,7,8,9])
b = array([2,4,6,8,10,12,13,15])
c = array([-1,-2,-2,-3,-4,-6,-7,-8])
>>> corrcoef([a,b,c])
array([[ 1.        ,  0.99535001, -0.9805214 ],
       [ 0.99535001,  1.        , -0.97172394],
       [-0.9805214 , -0.97172394,  1.        ]])

10. 杰卡德相似系数(Jaccard similarity coefficient)和杰卡德距离(Jaccard distance)

定义和公式

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

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

与杰卡德相似系数 相反的概念是杰卡德距离(Jaccard distance)。

杰卡德距离可用如下公式表示, 用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度:
这里写图片描述

应用

可将杰卡德相似系数用在衡量样本的相似度上。

举个栗子

样本A与样本B是两个n维向量,而且所有维度的取值都是0或1,例如:A(0111)和B(1011)。

我们将样本看成是一个集合,1表示集合包含该元素,0表示集合不包含该元素。

M11:样本A与B都是1的维度的个数
M01:样本A是0,样本B是1的维度的个数
M10:样本A是1,样本B是0 的维度的个数
M00:样本A与B都是0的维度的个数

依据上文给的杰卡德相似系数及杰卡德距离的相关定义,样本A与B的杰卡德相似系数J可以表示为:
这里写图片描述

这里M11+M01+M10可理解为A与B的并集的元素个数,而M11是A与B的交集的元素个数。

11. 皮尔逊系数(Pearson Correlation Coefficient)

我们已经描述了什么是相关系数(Correlation coefficient)与相关距离(Correlation distance),此处需要用到相关概念。

描述

在统计学中,皮尔逊积矩相关系数(英语:Pearson product-moment correlation coefficient,又称作 PPMCC或PCCs, 用r表示)用于度量两个变量X和Y之间的相关(线性相关), 其值介于-1与1之间

通常情况下通过以下取值范围判断变量的相关强度:

相关系数 相关程度

0.8-1.0 极强相关
0.6-0.8 强相关
0.4-0.6 中等程度相关
0.2-0.4 弱相关
0.0-0.2 极弱相关或无相关

在自然科学领域中,该系数广泛用于度量两个变量之间的相关程度。它是由卡尔·皮尔逊从弗朗西斯·高尔顿在19世纪80年代提出的一个相似却又稍有不同的想法演变而来的。这个相关系数也称作“皮尔森相关系数r”。

定义和公式

两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商:
这里写图片描述

以上方程定义了总体相关系数, 一般表示成希腊字母ρ(rho)。基于样本对协方差和方差进行估计,可以得到样本标准差, 一般表示成r:
这里写图片描述

Python代码实现

  from math import sqrt

def multipl(a,b):
    sumofab=0.0
    for i in range(len(a)):
        temp=a[i]*b[i]
        sumofab+=temp
    return sumofab

def corrcoef(x,y):
    n=len(x)
    #求和
    sum1=sum(x)
    sum2=sum(y)
    #求乘积之和
    sumofxy=multipl(x,y)
    #求平方和
    sumofx2 = sum([pow(i,2) for i in x])
    sumofy2 = sum([pow(j,2) for j in y])
    num=sumofxy-(float(sum1)*float(sum2)/n)
    #计算皮尔逊相关系数
    den=sqrt((sumofx2-float(sum1**2)/n)*(sumofy2-float(sum2**2)/n))
    return num/den

x = [0,1,0,3]
y = [0,1,1,1]

print corrcoef(x,y) #0.471404520791

12. 信息熵(Information Entropy)

信息熵并不属于一种相似性度量。但在有些时候,对两个向量的距离进行判断,或者对两个向量进行相似度度量,或者需要对某些点进行取舍的时候,并非一定按照距离或相似度的比较来取舍,有些是 按照整体数据集的信息熵的变化大小来取舍的

例如,在决策树模型中,判断如何 选择哪个特征进行分类,使用的就是 信息增益或信息增益比来进行判断。

距离和相似度都是用来取舍的一种度量方法,信息熵也算是一种。因此,把他们放到一起来比较。

描述

信息熵是衡量分布的混乱程度或分散程度的一种度量。分布越分散(或者说分布越平均),信息熵就越大。分布越有序(或者说分布越集中),信息熵就越小。

定义和公式

计算给定的样本集X的信息熵的公式为:
这里写图片描述
其中,n表示样本集X的分类数,pi表示X中第i类元素出现的概率。

信息熵越大表明样本集S分类越分散,信息熵越小则表明样本集X分类越集中。。当S中n个分类出现的概率一样大时(都是1/n),信息熵取最大值log2(n)。当X只有一个分类时,信息熵取最小值0。

总结

把距离、相似度和熵的度量方法列出来了。下面最后做一个总结。July在他的博客里做了总结,我补充了下,结果如下:

  空间:欧氏距离;
路径:曼哈顿距离;
国际象棋国王:切比雪夫距离;
以上三种的统一形式:闵可夫斯基距离;
加权:标准化欧氏距离;
排除量纲和依存:马氏距离;
测量两个离散或连续概率分布的相似性:巴氏距离
编码差别:汉明距离;
向量差距:夹角余弦;
相关:相关系数与相关距离;
集合近似度:杰卡德相似系数与距离;
度量两个变量X和Y之间的相关(线性相关):皮尔逊系数;
衡量分布的混乱程度或分散程度:熵。

思维导图:

这里写图片描述

致谢

  • http://www.manyjar.com:8080/search/mahout-distribution-0.9-src.zip.html‘>mahout源码
  • http://www.cnblogs.com/heaad/archive/2011/03/08/1977733.html‘>机器学习中的相似性度量
  • http://blog.csdn.net/v_july_v/article/details/8203674/‘>从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
  • http://arthur503.github.io/blog/2013/10/03/Statistical-Methods-appendix-hilbert-space-and-more-spaces.html‘>统计学习方法BR-附录:希尔伯特空间、欧几里得空间和巴拿赫空间【存疑】
  • a href=’ http://zh.wikipedia.org/wiki/%E6%9B%BC%E5%93%88%E9%A0%93%E8%B7%9D%E9%9B%A2‘>曼哈顿距离
  • http://zh.wikipedia.org/wiki/%E5%88%87%E6%AF%94%E9%9B%AA%E5%A4%AB%E8%B7%9D%E7%A6%BB‘>切比雪夫距离
  • http://en.wikipedia.org/wiki/List_of_mathematical_symbols‘>List of mathematical symbols
  • http://en.wikipedia.org/wiki/Minkowski_distance‘>Minkowski distance
  • http://en.wikipedia.org/wiki/Mahalanobis_distance‘>Mahalanobis distance
  • http://arthur503.github.io/blog/2013/09/05/edit-distance-how-faraway-are-we-1.html‘>编辑距离:我和你到底有多远?(一)
  • 作者:shibing624 发表于2016/12/22 17:51:48 原文链接
    阅读:599 评论:0 查看评论

    相关 [距离 相似 度量] 推荐:

    [原]距离及相似度度量方法

    - - 狮子座明仔知识集散场
    关于距离度量的方法的专题其实已经想做好久了,正好趁这个机会总结出来. 这里讨论的距离度量应该是向量空间内的度量,两个点(即两个向量)之间的距离或相似性的度量. 每种度量包括描述、定义和公式、优缺点、应用等部分. 编辑距离:也叫Levenshtein距离,用来测量文本之间的距离. 欧氏距离(Euclidean distance).

    海量数据相似度计算之simhash和海明距离

    - - CSDN博客架构设计推荐文章
    通过  采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析. 分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法. 常见的有余弦夹角算法、欧式距离、Jaccard相似度、最长公共子串、编辑距离等. 这些算法对于待比较的文本数据不多时还比较好用,如果我们的爬虫每天采集的数据以千万计算,我们如何对于这些海量千万级的数据进行高效的合并去重.

    文本相似度计算-google的simHash汉明距离

    - - 行业应用 - ITeye博客
           针对文本相似性计算,很多开发朋友首先想到的应该是使用向量空间模型VSM(Vector Space Model). 使用VSM计算相似度,先对文本进行分词,然后建立文本向量,把相似度的计算转换成某种特征向量距离的计算,比如余弦角、欧式距离、Jaccard相似系数等. 这种方法存在很大一个问题:需要对文本两两进行相似度比较,无法扩展到海量文本的处理.

    [记录]字符串相似度算法(编辑距离算法 Levenshtein Distance)

    - - xilo's blog
    在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录. 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同. 许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符.

    利用编辑距离(Edit Distance)计算两个字符串的相似度

    - - Java - 编程语言 - ITeye博客
    利用编辑距离(Edit Distance)计算两个字符串的相似度.         编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数. 许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 一般来说,编辑距离越小,两个串的相似度越大.

    java 两字符串相似度计算算法 (转)Levenshtein Distance编辑距离算法

    - - 开源软件 - ITeye博客
    Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,用他的名字命名. 不会拼读,可以叫它edit distance(编辑距离). 原理很简单,就是返回将第一个字符串转换(删除、插入、替换)成第二个字符串的编辑次数. 次数越少,意味着字符串相似度越高 .

    编辑距离(Edit Distance | Levenshtein距离)

    - - CSDN博客互联网推荐文章
    编辑距离又称为Levenshtein距离,是指两个字符串之间,从一个字符串变成另一个字符串所需要的 最小编辑操作次数. 可以采用的编辑操作包括: 插入操作、替换操作和删除操作. 例如:字符串“a“ 与字符串 ”b“的编辑距离为1,只有一个替换操作. 将”kitten一字转成“sitting”的编辑距离为3:.

    近距离拍摄动物

    - doodle - 玩意儿
    摄影师 Igor Siwanowicz 微距拍摄昆虫和其他小动物,令人惊讶的作品. 本文原始链接:http://www.cngadget.cn/close-up-photos-of-animals.html.

    solr相似匹配

    - - CSDN博客推荐文章
    相似匹配   在我们使用网页搜索时,会注意到每一个结果都包含一个 “相似页面” 链接,单击该链接,就会发布另一个搜索请求,查找出与起初结果类似的文档. Solr 使用 MoreLikeThisComponent(MLT)和 MoreLikeThisHandler 实现了一样的功能. 如上所述,MLT 是与标准 SolrRequestHandler 集成在一起的;MoreLikeThisHandler 与 MLT 结合在一起,并添加了一些其他选项,但它要求发布一个单一的请求.

    地球与月球的真实距离

    - 慢慢叫 - YesKafei Daily
    月亮的年龄大约有46亿年,与地球之间的平均距离是约为38万公里,近地点距离约为36万公里,相当于60个地球半径之远. 这张图按照比例关系,展示出真实地月之间的距离. Speed of Light in Holy Quran, 月球 (Wikipedia). 巨大的小行星在今年11月将飞过地球. 一位挪威攝影師七天不眠不休之作 (@dongde).