一些常见的距离与一些常用的measure

来源:互联网 发布:ipad发展 知乎 编辑:程序博客网 时间:2024/06/05 14:04

距离具有一些性质。如果d(p1, p2)是两个点p1和p2之间的距离,则如下性质成立:

      (1)非负性

              (a)对于所有的p1和p2,d(p1, p2)≥0,

              (b)当且仅当p1=p2时,d(p1, p2)=0。

      (2)对称性

              对于所有的p1和p2,d(p1, p2)=d(p2, p1)。

      (3)三角不等式

              对于所有的p1、p2和p3,d(p1, p3)≤d(p1, p2)+p(p2, p3)。

满足以上三个性质的测度(Measure)称为度量(Metric)。

 

下面给出一些常用的距离:

(1)闵可夫斯基距离(Minkowski distance ):是欧几里得空间的一个度量,是曼哈顿距离和欧几里得距离的一般化形式。对于空间中的两个点p1(x1, x2, ..., xn),p2(y1, y2, ..., yn),定义它们的闵可夫斯基距离为:

这个也叫Lr-norm,当r=1是就是L1-norm或者叫哈曼顿距离,r=2时叫L2-norm或者叫欧几里得距离。当r趋向于无穷时,我们得到切比雪夫距离:

 

给定p1、p2和 r,欧氏空间的距离可以如下求得:

view plain
  1. def euclidean_space_distance(p1, p2, r):  
  2.     sum = 0  
  3.     for i in range(len(p1)):  
  4.         sum = sum+pow(abs(p1[i]-p2[i]), r)  
  5.     return pow(sum, 1/r)  

 

(2)Jaccard距离

两个集合A和B的Jaccard 距离被定义为1-J(A, B),其中J(A, B)为Jaccard相似系数(Jaccard similarity coefficient or Jaccard index),两个集合Jaccard相似系数为两个集合的交集的元素个数除以两个集合并集的元素个数:

view plain
  1. def jaccard_similarity_coefficient(A, B):  
  2.     C=A.intersection(B)  
  3.     return 1-(len(C)/(len(A)+len(B)-len(C)))  

 

(3)余弦相似度

通常文档用向量表示,向量的每个属性代表一个特定的词在文档中出现的频率。定义余弦相似度:如果x和y是两个文档向量,则:

"."表示向量点积,||x||表示向量x的长度。余弦相似度不方法数据对象的重要性的量级(当量级是重要的时,欧几里得距离可能是更好的选择)。

view plain
  1. def consine_similarity(x, y):  
  2.     dot_product = 0  
  3.     square_x = 0  
  4.     square_y = 0  
  5.     for i in range(len(x)):  
  6.         dot_product = dot_product + x[i]*y[i]  
  7.         square_x = square_x+x[i]*x[i]  
  8.         square_y = square_y+y[i]*y[i]  
  9.     return dot_product/(pow(square_x, 0.5)*pow(square_y, 0.5))  
  10. x = (3205000200)  
  11. y = (1000000102)  
  12. print(consine_similarity(x, y))  

 

 

(4)广义Jaccard系数(又叫Tanimoto系数,但还有一种系数也叫Tanimoto系数,这里就不用了)

可用于文档数据,在二元属性情况下规约为Jaccard系数,用EJ表示:

至于所谓的二元属性下规约为Jaccard系数举个例子就知道了:

x = (1, 1, 0, 0, 1), y = (0, 1, 1, 0, 0)

这里顺便提一下:对于两个n维向量x和y,每个属性都是一个二元属性(只能取0或1),

M11表示x取1,y也取1的属性个数

M10表示x取1,y取0的属性个数

M01表示x取0,y取1的属性个数

M00表示x取0,y也取0的属性个数

都取0的情况在计算Jaccard系数时时不考虑的,因为比如对于两个文档向量,其实0占的很多,就是文档向量其实是稀疏的,如果考虑都取0的情况,那两个文档会因为0多而相似,不合理。

因此:

所以对于上面给出的两个向量x和y

J(x, y) = 1/(2+1+1) = 1/4

EJ(x, y) = 1/(3+2-1) = 1/4

 

(5)皮尔逊相关系数(Pearson Correlation Coefficient)

用来两个变量相关的程度(这里的变量应该可以说是向量或者数据集吧),由以下公式给出:

view plain
  1. def preason_correlation_coefficient(x, y):  
  2.     sumx = 0  
  3.     sumy = 0  
  4.     sum_xsquare = 0  
  5.     sum_ysquare = 0  
  6.     sum_product = 0  
  7.     n = len(x)  
  8.     for i in range(n):  
  9.         sumx = sumx+x[i]  
  10.         sumy = sumy+y[i]  
  11.         sum_xsquare = sum_xsquare+x[i]*x[i]  
  12.         sum_ysquare = sum_ysquare+y[i]*y[i]  
  13.         sum_product = sum_product+x[i]*y[i]  
  14.       
  15.     num = sum_product-(sumx*sumy/n)  
  16.     den = pow((sum_xsquare-pow(sumx, 2)/n)*(sum_ysquare-pow(sumy, 2)/n), 0.5)  
  17.       
  18.     if den==0:  
  19.         return 0  
  20.     return num/den  
  21. x = (123)  
  22. y = (256)  
  23. print(preason_correlation_coefficient(x, y))  

原创粉丝点击