# python实现相似性/距离的度量

## L1 绝对值/曼哈顿距离

``````import numpy as np

def manhattan_dist(p, q):
'''
曼哈顿距离/绝对距离(L1范数)
INPUT  -> 长度一致的向量1、向量2
举例: p = [1,2,6]; q = [1,3,5]
'''
p = np.mat(p)
q = np.mat(q)
# return np.linalg.norm(p-q, ord=1)
return np.sum(np.abs(p-q))

p = [1,3,2,3,4,3]
q = [1,3,4,3,2,3]
print(manhattan_dist(p,q))
``````

## L2 欧氏距离

``````def euclidean_dist(p, q):
'''
欧式距离(L2范数)
INPUT  -> 长度一致的向量1、向量2
'''
p = np.mat(p)
q = np.mat(q)
# return math.sqrt(np.sum(np.square(p-q)))
# return np.linalg.norm(p-q)
return math.sqrt(np.sum(np.power(p-q, 2)))

def euclidean_dist_2(p, q):
'''
坐标点间欧式距离(速度快)
INPUT  -> 坐标1、坐标2
'''
return math.sqrt(math.pow(p[0]-q[0], 2)+math.pow(p[1]-q[1], 2))

def standardized_euclidean_dist(p, q):
'''
标准化欧式距离
INPUT  -> 长度一致的向量1、向量2
'''
sumnum = 0
for i in range(len(p)):
# 计算si 分量标准差
avg = (p[i]-q[i])/2
si = math.sqrt((p[i]-avg)**2+(q[i]-avg)**2)
sumnum += ((p[i]-q[i])/si )**2
return math.sqrt(sumnum)
``````

## L-∞ 切比雪夫距离

``````def chebyshev_dist(p, q):
'''
切比雪夫距离(L-∞范数)
INPUT  -> 长度一致的向量1、向量2
'''
p = np.mat(p)
q = np.mat(q)
# return np.abs(p-q).max()
# return np.linalg.norm(p-q, ord=np.inf)
return np.max(np.abs(p-q))
``````

## 汉明距离

``````def hanming_dist(p, q):
'''
汉明距离
INPUT  -> 长度一致的向量1、向量2
'''
p = np.mat(p)
q = np.mat(q)
smstr = np.nonzero(p-q)
return np.shape(smstr)[1]
``````

## 杰卡德相似系数/杰卡德距离

``````def jaccard_sim(p, q):
'''
计算两个向量的杰卡德相似系数
INPUT  -> 长度一致的向量1、向量2
'''
set_p = set(p)
set_q = set(q)
sim = float(len(set_p & set_q))/ len(set_p | set_q)
return sim

def jaccard_dist(p, q):
'''
计算两个向量的杰卡德距离
INPUT  -> 长度一致的向量1、向量2
'''
set_p = set(p)
set_q = set(q)
dis = float(len((set_p | set_q)-(set_p & set_q)))/ len(set_p | set_q)
# dis = pdist([p, q],'jaccard')
return dis
``````

## 余弦夹角相似度/余弦距离

``````def cosin_dist(p, q):
'''
计算两个向量的余弦距离
INPUT  -> 长度一致的向量1、向量2
'''
# return 1-np.dot(p,q)/(np.linalg.norm(p)*(np.linalg.norm(q)))
return pdist(np.vstack([p, q]), 'cosine')[0]
``````