欧氏距离
源自两点之间的距离公式
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 坐标之间差值之和。
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)。切比雪夫距离用于计算各维度数值差中的最大值,计算公式如下。
闵可夫斯基距离
- 当 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)
余弦相似度
余弦相似度是量化两个或多个向量之间相似性的度量。余弦相似度是向量之间角度的余弦,用于衡量两个向量的夹角。夹角越小,两个向量越相似
公式:
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])
简单应用
第一步:特征提取
第二步:计算余弦相似度
两个句子的相似度是80%
Jaccard相似度
Jaccard 相似度衡量有限样本集之间的相似性,
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])