相似度-Similarity

60 阅读2分钟

欧氏距离

源自两点之间的距离公式

image.png

from math import*

def euclidean_distance(x,y):

    return sqrt(sum(pow(a-b,2) for a, b in zip(x, y)))

print euclidean_distance([0,3,4,5],[7,6,3,-1])

曼哈顿距离

简单来说就是 x 坐标和 y 坐标之间差值之和。

image.png

from math import*

def manhattan_distance(x,y):

    return sum(abs(a-b) for a,b in zip(x,y))

print manhattan_distance([10,20,10],[10,20,20])

切比雪夫距离

在国际象棋棋盘上,国王可以朝8个方向移动。国王移动到目标点所需的步数就是切比雪夫距离(Chebyshev Distance)。切比雪夫距离用于计算各维度数值差中的最大值,计算公式如下。

image.png

闵可夫斯基距离

image.png

  • 当 p=1 时,就是曼哈顿距离。
  • 当 p=2 时,就是欧氏距离。
  • 当 p→∞ 时,就是切比雪夫距离。 以上三种距离都有一个缺点,就是容易受特征量纲的影响。
from math import*
from decimal import Decimal

def nth_root(value, n_root):

    root_value = 1/float(n_root)
    return round (Decimal(value) ** Decimal(root_value),3)

def minkowski_distance(x,y,p_value):

    return nth_root(sum(pow(abs(a-b),p_value) for a,b in zip(x, y)),p_value)

print minkowski_distance([0,3,4,5],[7,6,3,-1],3)

余弦相似度

余弦相似度是量化两个或多个向量之间相似性的度量。余弦相似度是向量之间角度的余弦,用于衡量两个向量的夹角。夹角越小,两个向量越相似转存失败,建议直接上传图片文件 公式: image.png

image.png image.png
from math import*

def square_rooted(x):

    return round(sqrt(sum([a*a for a in x])),3)

def cosine_similarity(x,y):

    numerator = sum(a*b for a,b in zip(x,y))
   denominator = square_rooted(x)*square_rooted(y)
   return round(numerator/float(denominator),3)

print cosine_similarity([3, 45, 7, 2], [2, 54, 13, 15])

简单应用

第一步:特征提取

image.png

第二步:计算余弦相似度

11+11+11+11+10+01=41*1 + 1*1 + 1*1 + 1*1 + 1*0 + 0*1 = 4
12+12+12+12+12+02=2.2360679775√1² + 1² + 1² + 1² + 1² + 0² = 2.2360679775
12+12+12+12+02+12=2.2360679775√1² + 1² + 1² + 1² + 0²+ 1² = 2.2360679775
(4)/(2.23606797752.2360679775)=0.80(4) / (2.2360679775*2.2360679775) = 0.80

两个句子的相似度是80%

Jaccard相似度

Jaccard 相似度衡量有限样本集之间的相似性,

image.png

image.png

image.png

from math import*

def jaccard_similarity(x,y):

    intersection_cardinality = len(set.intersection(*[set(x), set(y)]))
    union_cardinality = len(set.union(*[set(x), set(y)]))
    return intersection_cardinality/float(union_cardinality)

print jaccard_similarity([0,1,2,5,6],[0,2,3,5,7,9])