距离和相似度度量

主要摘自: http://www.chinaz.com/web/2011/1008/212684.shtml,http://www.cnblogs.com/heaad/archive/2011/03/08/1977733.html


在数据分析和数据挖掘的过程中,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别。最常见的是数据分析中的相关分析,数据挖掘中的分类和聚类算法,如K最近邻(KNN)和K均值(K-Means)。当然衡量个体差异的方法有很多,最近查阅了相关的资料,这里整理罗列下。

为了方便下面的解释和举例,先设定我们要比较X个体和Y个体间的差异,它们都包含了N个维的特征,即X=(x1, x2, x3, … xn),Y=(y1, y2, y3, … yn)。下面来看看主要可以用哪些方法来衡量两者的差异,主要分为距离(Distance)度量和相似度(Similarity)度量。

1. 距离度量

一、距离度量

距离度量(Distance)用于衡量个体在空间上存在的距离,距离越远说明个体间的差异越大。


 如果用dij表示第i个样品和第j个样品之间的距离,那么对一切i,j和k,距离度量dij应该满足如下四个条件:
①当且仅当i=j时,dij=0
②dij>0
③dij=dji(对称性)
④dij≤dik+dkj(三角不等式)


常用的距离度量如下

1. 欧几里得距离或欧氏距离(Euclidean Distance)

欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:

Euclidean Distance

因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别(量纲/尺度),比如对身高(cm)和体重(kg)两个单位不同的指标使用欧式距离可能使结果失效。

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

 

(2)三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离:

 

(3)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离:

 

  也可以用表示成向量运算的形式:

 

(4)Matlab计算欧氏距离

Matlab计算距离主要使用pdist函数。若X是一个M×N的矩阵,则pdist(X)将X矩阵M行的每一行作为一个N维向量,然后计算这M个向量两两间的距离。

例子:计算向量(0,0)、(1,0)、(0,2)两两间的欧式距离

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X,'euclidean')

结果:

D =

    1.0000    2.0000    2.2361


2. 标准化欧式距离

标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧。均值和方差标准化到多少呢?这里先复习点统计学知识吧,假设样本集X的均值(mean)为m,标准差(standard deviation)为s,那么X的“标准化变量”表示为:

  而且标准化变量的数学期望为0,方差为1。因此样本集的标准化过程(standardization)用公式描述就是:

  标准化后的值 =  ( 标准化前的值  - 分量的均值 ) /分量的标准差

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

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

(2)Matlab计算标准化欧氏距离

例子:计算向量(0,0)、(1,0)、(0,2)两两间的标准化欧氏距离 (假设两个分量的标准差分别为0.5和1)

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X, 'seuclidean',[0.5,1])

结果:

D =

    2.0000    2.0000    2.8284

3. 马氏距离(mahalanobis

与欧式距离不同的是马氏距离考虑到各种特性之间的联系,并且是尺度无关的(scale-invariant),即独立于测量尺度。下图为欧式距离与马氏距离的度量结果比较。



(1)马氏距离定义

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

 

       而其中向量Xi与Xj之间的马氏距离定义为:

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

       也就是欧氏距离了。

     若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。

(2) Matlab计算(1 2),( 1 3),( 2 2),( 3 1)两两之间的马氏距离

X = [1 2; 1 3; 2 2; 3 1]

Y = pdist(X,'mahalanobis')

 

结果:

Y =

    2.3452    2.0000    2.3452    1.2247    2.4495    1.2247

4. 曼哈顿距离(Manhattan Distance)

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

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

 

(2)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的曼哈顿距离

 

(3) Matlab计算曼哈顿距离

例子:计算向量(0,0)、(1,0)、(0,2)两两间的曼哈顿距离

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X, 'cityblock')

结果:

D =

     1     2     3


5. 切比雪夫距离 ( Chebyshev Distance )

       国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走试试。你会发现最少步数总是max( | x2-x1 | , | y2-y1 | ) 步 。有一种类似的一种距离度量方法叫切比雪夫距离。

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

 

(2)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的切比雪夫距离

 

  这个公式的另一种等价形式是

 

       看不出两个公式是等价的?提示一下:试试用放缩法和夹逼法则来证明。

(3)Matlab计算切比雪夫距离

例子:计算向量(0,0)、(1,0)、(0,2)两两间的切比雪夫距离

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X, 'chebychev')

结果:

D =

     1     2     2


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

闵氏距离不是一种距离,而是一组距离的定义。

(1) 闵氏距离的定义

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

 

其中p是一个变参数。

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

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

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

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

(2)闵氏距离的缺点

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

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

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

(3)Matlab计算闵氏距离

例子:计算向量(0,0)、(1,0)、(0,2)两两间的闵氏距离(以变参数为2的欧氏距离为例)

X = [0 0 ; 1 0 ; 0 2]

D = pdist(X,'minkowski',2)

结果:

D =

    1.0000    2.0000    2.2361

7. 汉明距离(Hamming distance)

(1)汉明距离的定义

       两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数。例如字符串“1111”与“1001”之间的汉明距离为2。

       应用:信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)。

(2)Matlab计算汉明距离

  Matlab中2个向量之间的汉明距离的定义为2个向量不同的分量所占的百分比。

       例子:计算向量(0,0)、(1,0)、(0,2)两两间的汉明距离

X = [0 0 ; 1 0 ; 0 2];

D = PDIST(X, 'hamming')

结果:

D =

    0.5000    0.5000    1.0000

 

二、 相似度度量

1. 夹角余弦(Cosine)

 余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。公式如下:

(1)在二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:

(2) 两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦

       类似的,对于两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可以使用类似于夹角余弦的概念来衡量它们间的相似程度。

  即:

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

(3)Matlab计算夹角余弦

例子:计算(1,0)、( 1,1.732)、( -1,0)两两间的夹角余弦

X = [1 0 ; 1 1.732 ; -1 0]

D = 1- pdist(X, 'cosine')  % Matlab中的pdist(X, 'cosine')得到的是1减夹角余弦的值

结果:

D =

    0.5000   -1.0000   -0.5000

2.调整余弦相似度(Adjusted Cosine Similarity)

其与余弦相似性不同在于:将不同用户的打分规模考虑进去,其中 表示用户 u 的平均打分。余弦相似性没有考虑不同用户的
打分规模会造成平均打分较高的用户对相似度计算作用大于其余用户,使得每个用户的打分对相似度计算的贡献率不相等,造成
相似度计算不如调整余弦相似度的计算精确。


在实际应用中,在数据库中打分数据分布极其稀疏的情况下,调整余弦的相似度的度量也会遇到在余弦相似性计算中所遇到的情况,即当项目只有一两个共同评分用户,项目相似性的计算仅仅是反映了这一两个用户所关注的项目特征在这两个项目中是否相同,而这一两个用户所关注的项目特征并不一定是待推荐用户所关注的特征,并且一两个特征的相似也不能真正反映两个项目之间的相似性。另外,在进行算法精度测试试验中,发现调整余弦的相似度计算有出现分母为 0 的情况。在程序测试过程中发现,分母为 0 有两种情况:
a) 两项目只有一个共同打分的用户,该用户对很少的项目打分且打分值相同 。这种情况,按照余弦相似性的思想,可以认为两项目的相似度值为 1 。
b) 两项目有为数很少的共同评分用户, 且出现或 的情况。在这种情况下,调整余弦无法正确计算出两项目之间的相似度,因此在数据极其稀疏的条件下,不宜采用调整余弦相似度进行度量。

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

(1) 杰卡德相似系数

Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具体值的大小,只能获得“是否相同”这个结果,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。如果比较XYJaccard相似系数,只比较xnyn中相同的个数,公式如下:

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

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

(2) 杰卡德距离

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

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

(3) 杰卡德相似系数与杰卡德距离的应用

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

  样本A与样本B是两个n维向量,而且所有维度的取值都是0或1。例如:A(0111)和B(1011)。我们将样本看成是一个集合,1表示集合包含该元素,0表示集合不包含该元素。

p :样本A与B都是1的维度的个数

q :样本A是1,样本B是0的维度的个数

r :样本A是0,样本B是1的维度的个数

s :样本A与B都是0的维度的个数


那么样本A与B的杰卡德相似系数可以表示为:

这里p+q+r可理解为A与B的并集的元素个数,而p是A与B的交集的元素个数。

而样本A与B的杰卡德距离表示为:

(4)Matlab 计算杰卡德距离

Matlab的pdist函数定义的杰卡德距离跟我这里的定义有一些差别,Matlab中将其定义为不同的维度的个数占“非全零维度”的比例。

例子:计算(1,1,0)、(1,-1,0)、(-1,1,0)两两之间的杰卡德距离

X = [1 1 0; 1 -1 0; -1 1 0]

D = pdist( X , 'jaccard')

结果

D =

0.5000    0.5000    1.0000


4. 相关系数 ( Correlation coefficient )与相关距离(Correlation distance)

(1) 相关系数的定义

相关系数是衡量随机变量X与Y相关程度的一种方法,相关系数的取值范围是[-1,1]。相关系数的绝对值越大,则表明X与Y相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关)。

(2)相关距离的定义

 

(3)Matlab计算(1, 2 ,3 ,4 )与( 3 ,8 ,7 ,6 )之间的相关系数与相关距离

X = [1 2 3 4 ; 3 8 7 6]

C = corrcoef( X' )   %将返回相关系数矩阵

D = pdist( X , 'correlation')

结果:

C =

    1.0000    0.4781

    0.4781    1.0000

D =

0.5219

      其中0.4781就是相关系数,0.5219是相关距离。


5. 信息熵(Information Entropy)

       信息熵并不属于一种相似性度量。那为什么放在这篇文章中啊?这个。。。我也不知道。 (╯▽╰)

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

       计算给定的样本集X的信息熵的公式:

参数的含义:

n:样本集X的分类数

pi:X中第i类元素出现的概率

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

三、距离度量与相似性度量的区别

我们将以距离度量中最有代表性的欧式距离与相似性度量中的余弦相似度为例,来比较二者的不同。欧氏距离是最常见的距离度量,而余弦相似度则是最常见的相似度度量,很多的距离度量和相似度度量都是基于这两者的变形和衍生,所以下面重点比较下两者在衡量个体差异时实现方式和应用环境上的区别。借助三维坐标系来看下欧氏距离和余弦相似度的区别:



distance and similarity

从图上可以看出距离度量衡量的是空间各点间的绝对距离,跟各个点所在的位置坐标(即个体特征维度的数值)直接相关;而余弦相似度衡量的是空间向量的夹角,更加的是体现在方向上的差异,而不是位置。如果保持A点的位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦相似度cosθ是保持不变的,因为夹角不变,而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦相似度的不同之处。

 

根据欧氏距离和余弦相似度各自的计算方式和衡量特征,分别适用于不同的数据分析模型:欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;而余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)。


四、关于马氏距离的补充说明

1)马氏距离的计算是建立在总体样本的基础上的,这一点可以从上述协方差矩阵的解释中可以得出,也就是说,如果拿同样的两个样本,放入两个不同的总体中,最后计算得出的两个样本间的马氏距离通常是不相同的,除非这两个总体的协方差矩阵碰巧相同;

2)在计算马氏距离过程中,要求总体样本数大于样本的维数,否则得到的总体样本协方差矩阵逆矩阵不存在,这种情况下,用欧式距离来代替马氏距离,也可以理解为,如果样本数小于样本的维数,这种情况下求其中两个样本的距离,采用欧式距离计算即可。

3)还有一种情况,满足了条件总体样本数大于样本的维数,但是协方差矩阵的逆矩阵仍然不存在,比如A(3,4),B(5,6);C(7,8),这种情况是因为这三个样本在其所处的二维空间平面内共线(如果是大于二维的话,比较复杂???)。这种情况下,也采用欧式距离计算。

4)在实际应用中“总体样本数大于样本的维数”这个条件是很容易满足的,而所有样本点出现3)中所描述的情况是很少出现的,所以在绝大多数情况下,马氏距离是可以顺利计算的,但是马氏距离的计算是不稳定的,不稳定的来源是协方差矩阵,这也是马氏距离与欧式距离的最大差异之处。

我们熟悉的欧氏距离虽然很有用,但也有明显的缺点。它将样品的不同属性(即各指标或各变量)之间的差别等同看待,这一点有时不能满足实际要求。马氏距离有很多优点。它不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关;由标准化数据和中心化数据(即原始数据与均值之差)计算出的二点之间的马氏距离相同。马氏距离还可以排除变量之间的相关性的干扰。它的缺点是夸大了变化微小的变量的作用。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 欧几里得距离度量是一种常用的序列相似度度量方法,它通过计算两个序列间每一维度的差值的平方和来衡量两个序列的相似程度。其公式为:$\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2}$。这种方法对于序列长度相同的情况下效果较好,但对于长度不同的序列可能不太适用。 ### 回答2: 欧几里得距离是一种常用的曲线相似度度量方法。它基于欧几里得空间中两点之间的直线距离。对于曲线A和曲线B,我们可以将其表示为两个点集,分别记为A = {(x1, y1), (x2, y2), ..., (xn, yn)}和B = {(x'1, y'1), (x'2, y'2), ..., (x'm, y'm)}。其中,(xi, yi)是曲线A上的第i个点,(x'i, y'i)是曲线B上的第i个点。 欧几里得距离的计算公式为:d = √((xi - x'i)² + (yi - y'i)²) 首先,我们需要对曲线A和曲线B进行等间隔采样,得到相同数量的点集。然后,根据计算公式,分别计算曲线A上每个点与曲线B上对应点之间的欧几里得距离。最后,将所有距离值求和并取平均,得到欧几里得距离曲线相似度度量值。 该方法的优点是简单易懂,计算速度快。然而,欧几里得距离对于曲线的平移、旋转和尺度变化较为敏感,会导致曲线相似度度量的误差。因此,在使用欧几里得距离进行曲线相似度度量时,需要考虑对曲线进行预处理,如对曲线进行规范化或使用其他更加鲁棒的相似度度量方法。 总的来说,欧几里得距离是一种简单有效的曲线相似度度量方法,但在某些情况下可能存在一定的误差,需要结合实际需求和曲线特征选择合适的相似度度量方法。 ### 回答3: 欧几里得距离是一种广泛应用于相似度度量的方法,尤其在图像处理、模式识别和数据挖掘领域被广泛使用。 欧几里得距离曲线相似度度量是基于欧几里得距离的计算方法,用于衡量两个曲线之间的相似程度。具体而言,对于两条曲线,我们可以将它们看作是在二维平面上的运动路径。欧几里得距离度量就是计算这两条曲线上各个点之间的距离并求和,从而得到两条曲线之间的距离。 假设有两条曲线A和B,它们的坐标点分别为A(xi, yi)和B(xi, yi),其中i表示曲线上的第i个点。则欧几里得距离计算公式为: d = √((A1-B1)² + (A2-B2)² + ... + (An-Bn)²) 其中d表示曲线A与曲线B之间的距离,n表示曲线上的点的个数。通过计算两条曲线上每个对应点之间的距离,并将其求和,可以得到它们之间的距离。 欧几里得距离曲线相似度度量的应用非常广泛。例如,在图像处理中,可以将一幅图像转化为曲线表示,然后通过计算曲线之间的距离,来判断图像的相似性或者进行图像检索。在模式识别中,可以通过计算两个模式曲线之间的距离,来判断它们是否属于同一类别。在数据挖掘中,可以利用欧几里得距离曲线相似度度量方法,对时间序列数据或者轨迹数据进行相似性分析和聚类。 总之,欧几里得距离曲线相似度度量是一种简单而有效的相似度计算方法,被广泛应用于多个领域,具有重要的实际应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值