各种距离和相似度名词详解

导语:聚类通常按照对象间的相似性进行分组,因此如何描述对象间相似性是聚类的重要问题。

 

目录

背景:

常见的距离算法:

1.1欧氏距离(Euclidean Distance)

1.2马氏距离(Mahalanobis Distance)

1.3曼哈顿距离(Manhattan Distance)

1.4切比雪夫距离(Chebyshev Distance)

1.5明可夫斯基距离(Minkowski Distance)

1.6汉明距离(Hamming distance)

常见的相似度(系数)算法

2.1余弦相似度(Cosine Similarity)

2.2皮尔森相关系数(Pearson Correlation Coefficient)

2.3Jaccard相似系数(Jaccard Coefficient)

2.4Tanimoto系数

2.5对数似然相似度/率

小结

3.1距离/相似度总结

3.2 相关扩展


背景:

按照样本点之间的亲疏远近程度进行分类:

  • 相似系数函数:两个样本点愈相似,则相似系数值愈接近1;样本点愈不相似,则相似系数值愈 接近0。
  • 距离函数:可以把每个样本点看作高维空间中的一个点,进而使用某种距离来表示样本点之间的相似性。距离较近的样本点性质较相似,距离较远的样本点则差异较大。

 

常见的距离算法:

1.1欧氏距离(Euclidean Distance)

(1)作用:衡量的是多维空间中任意两个点之间的绝对距离。

(2)计算公式:

(3)注意事项:

  • 优点:简单,kmeans常通过欧氏距离进行计算
  • 缺点:没有考虑分量之间的相关性,相关性变量会干扰结果。
  • 需要进行归一化,保证各维度指标在相同的刻度级别;
  • 欧式距离表征所有类别等概率出现情况下,类别之间的距离,即不考虑各种特性之间的联系。

(4)参考代码:

>>> import math

>>> def euclidean_distance(X,Y):

...     return math.sqrt(sum(pow(a-b,2) for a,b in zip(X,Y)))

...

>>> print euclidean_distance([1,2],[3,4])

2.82842712475

(5)扩展: 标准化欧氏距离 (Standardized Euclidean distance ),见后文3.2

 

1.2马氏距离(Mahalanobis Distance)

(1)作用:又称为数据的协方差距离。它是一种有效的计算两个未知样本集的相似度的方法。它考虑到各种特性之间的联系当类别先验概率并不相等时,马氏距离中引入的协方差参数(表征的是点的稀密程度)来平衡两个类别的概率。

(2)计算公式:

 

(3)注意事项:

  • 优点:不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关;马氏距离还可以排除变量之间的相关性的干扰。由标准化数据和中心化数据(即原始数据与均值之差)计算出的二点之间的马氏距离相同。
  • 缺点:不同的特征不能差别对待,可能夸大弱特征;受协方差矩阵不稳定的影响,马氏距离并不总是能顺利计算出。
  • 若协方差矩阵是对角矩阵,马氏距离变成了标准化欧氏距离;
  • 如果协方差矩阵为单位阵时,马氏距离退化为欧氏距离。

1.3曼哈顿距离(Manhattan Distance)

(1)作用:也叫城市街区距离(City Block distance),两点投影到各轴上的距离总和。

(2)计算公式:

(3)注意事项:略

(4)参考代码:

>>> def manhattan_distance(X,Y):                  

...      return sum(abs(a-b) for a,b in zip(X,Y))

...

>>> print manhattan_distance([1,2],[3,4])

4

1.4切比雪夫距离(Chebyshev Distance)

(0)背景:国际象棋中国王走一步能够移动到相邻的8个方格中的任意一个(横,竖,斜都能走(走自身4周的8格)只能1步1步走)。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?最少步数总是max( | x2-x1 | , | y2-y1 | ) 步,各坐标数值差的最大值。

(1)作用:两点投影到各轴上距离的最大值

(2)计算公式:

(3)注意事项:略

 

1.5明可夫斯基距离(Minkowski Distance)

(0)背景:p-norm(p范数)

(1)作用:又称为明氏距离,是欧氏距离的推广,是对多个距离度量公式的概括性的表述。根据变参数的不同,明氏距离可以表示一类的距离。这里明可夫斯基距离就是p-norm(p范数)的一般化定义。

(2)计算公式:

(3)注意事项:

  • p=1退化为曼哈顿距离
  • p=2退化为欧氏距离
  • 切比雪夫距离是明氏距离取极限的形式。

(4)参考代码:

>>> def minkowski_distance(X,Y,p):

...     _sum =  sum(pow(abs(a-b),p) for a,b in zip(X,Y))

...     _coeff = 1.0/p

...     return round(_sum**_coeff,3)

...

>>> print minkowski_distance([1,2],[3,4],2)

2.828

>>> print minkowski_distance([1,2],[3,4],1)

4.0

>>> print minkowski_distance([1,2],[3,4],1000)

2.001

1.6汉明距离(Hamming distance)

(0)背景:两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。

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

(2)计算公式:

  • 1011101 与 1001001 之间的汉明距离是 2。
  • 2143896 与 2233796 之间的汉明距离是 3。
  • "toned" 与 "roses" 之间的汉明距离是 3。

(3)注意事项:略

 

常见的相似度(系数)算法

2.1余弦相似度(Cosine Similarity)

(1)作用:用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。注重方向上的差异而非距离或长度上的

(2)计算公式:

(3)注意事项:

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

(4)参考代码:

>>> def cosione_similarity(X,Y):

...     _x = np.array(X)

...     _y = np.array(Y)

...     _numerator = sum(map(float,_x*_y))

...     _denominator = np.linalg.norm(_x,ord=2)*np.linalg.norm(_y,ord=2)

...     return round(_numerator*1.0/_denominator,3)

...

>>> print cosione_similarity([0,1],[1,0])

0.0

>>> print cosione_similarity([3,0],[3,4])

0.6

2.2皮尔森相关系数(Pearson Correlation Coefficient)

(0)背景:又称相关相似性,通过Peason相关系数来度量两个用户的相似性。

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

(2)计算公式:

                相关系数 ( Correlation coefficient ):

               

 

                相关距离 ( Correlation distance ):

(3)注意事项:

  • 当相关系数为0时,X和Y两变量无关系;
  • 当X的值增大(减小),Y值增大(减小),两个变量为正相关,相关系数在0.00与1.00之间;
  • 当X的值增大(减小),Y值减小(增大),两个变量为负相关,相关系数在-1.00与0.00之间。

2.3Jaccard相似系数(Jaccard Coefficient)

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

(1)作用:衡量两个集合的相似度。

(2)计算公式:

 

(3)注意事项:

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

(4)参考代码:

>>> def jaccard_similarity(X,Y):

...     _intersection_len = len(set(X) & set(Y))

...     _union_len = len(set(X)|set(Y))

...     return round(_intersection_len*1.0/_union_len,3)

...

>>> print jaccard_similarity([1,2],[1,2,3,4,5,6,7])

0.286

2.4Tanimoto系数

(1)作用:广义Jaccard相似度,元素的取值可以是实数。又叫作谷本系数

(2)计算公式:

(3)注意事项:

  • 当向量X,Y都是二值向量时,那么Tanimoto系数等同于Jaccard距离。

2.5对数似然相似度/率

(1)参考:参考文章

小结

3.1距离/相似度总结

1、明(闵)可夫斯基距离:p范数的一般化定义,是一类距离的统称。p=1为曼哈顿距离(求的是路径和);p=2为欧氏距离;p无限的大则为切比雪夫距离(明氏距离的极限)。

2、欧式距离体现数值上的绝对差异,使用前要归一化;余弦距离体现方向上的差异,可以认为它消除了向量长度的影响;马氏距离是升级版的欧式距离,它考虑到各种特性之间的联系,因此引入了协方差参数(表征的是点的稀密程度)来平衡两个类别的概率。

3、汉明距离主要用于衡量信息编码。为了增强容错性,应使得编码间的最小汉明距离尽可能大

4、余弦相似度主要衡量两个向量之间的差距(方向而非长度);皮尔逊系数,即相关系数,是衡量两个随机变量相关程度的一种方法;Jaccard相似系数用于衡量集合相似度;谷本系数即广义Jaccard相似度,可以辨别两个取值为实数的向量的中,重叠内容的程度。

 

3.2 相关扩展

1、信息商:

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

(2)计算公式:

 

2、标准化欧氏距离 (Standardized Euclidean distance ):

(1)作用:对简单欧氏距离的缺点而作的一种改进方案。如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(Weighted Euclidean distance)。

(2)计算公式:

 

(3)注意事项:

  • 标准欧氏距离的思路:现将各个维度的数据进行标准化:标准化后的值 = ( 标准化前的值 - 分量的均值 ) /分量的标准差,然后计算欧式距离
  • 标准化变量的数学期望为0,方差为1
  • 样本集的标准化过程(standardization)用公式描述就是:
  •  

猜你喜欢

转载自blog.csdn.net/LHW4075/article/details/82915874