1. 闵可夫斯基距离
严格意义上讲,闵可夫斯基距离不是一种距离,而是一组距离的定义。
两个n维变量A(x11,x12,…x1n)与B(x21,x22,…,x2n)间的闵可夫斯基距离的定义为:
其中p是一个变参数
- [ ] 当p=1时,就是曼哈顿距离。
- [ ] 当p=2时,就是欧式距离。
- [ ] 当p→∞时,就是切比雪夫距离。
2. 欧氏距离(Euclidean Distance)
欧式距离(L2范数)是最易于理解的一种距离计算方法,源自欧式空间中两点间的距离公式:dist(A,B)
(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧式距离:
(2)三维空间间两点A(x1,y1,z1)与B(x2,y2,z2)间的欧式距离:
(3)两个n维向量A(x11,x12,…,x1n)与B(x21,x22,…,x2n)间的欧式距离:
表示为向量运算的形式:
(4)Python实现欧式距离
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print sqrt((vector1-vector2)*(vector-vector).T))
- 1
- 2
- 3
- 4
- 5
3. 曼哈顿距离(Manhattan Distance)
从名字就可以猜出这种距离的计算方法。想象你在曼哈顿要从一个十字路口来车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”(L1范数),而这也是曼哈顿距离名称的来源。曼哈顿距离也称为城市街区距离(City Block distance)
(1)二维平面两点A(x1,y1)与B(x2,y2)间的曼哈顿距离:
(2)两个n维向量A(x11,x12,…,x1n)与B(x21,x22,…,x2n)间的曼哈顿距离:
(3)Python实现曼哈顿距离
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print sum(abs(vector1-vector2))
- 1
- 2
- 3
- 4
- 5
4. 切比雪夫距离(Chebyshev Distance)
国际象棋中,国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?最少步数总是
步。有一种类似的距离度量方法叫作切比雪夫距离.。
(1)二维平面两点A(x1,y1)与B(x2,y2)间的切比雪夫距离:
(2)两个n维向量A(x11,x12,…,x1n)与B(x21,x22,…,x2n)间的切比雪夫距离:
这个公式的另一种等价形式是:
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,7,5])
print abs(vector1-vector2).max()
5. 夹角余弦(Cosine)
几何中的夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。
(1)在二维空间中向量A(x1,y1)与B(x2,y2)的夹角余弦公式
(2)两个n维样本点A(x11,x12,…,x1n)与B(x21,x22,…,x2n)的夹角余弦:可以使用类似于夹角余弦的概念来衡量它们间的相似程度。

夹角余弦取值范围为[-1,1]。夹角余弦越大,表示两个向量的夹角越小;夹角余弦越小,表示两个向量的夹角越大。当两个向量的方向重合时,夹角余弦取最大值1;当两个向量方向完全相反时,夹角余弦取最小值-1
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,7,5])
cosV12 = dot(vector1,vector2.T)/(linalg.norm(vector1)*linale.norm(vector2))
print cosV12
6. 汉明距离(Hamming Distance)
(1)汉明距离的定义:两个等长字符串s1与s2之间的汉明距离定义为将其中一个变为另外一个所需要的最小替换次数。例如字符串“1111”与“1001”之间的汉明距离为2.
应用:信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)
(2)Python实现汉明距离
from numpy import *
matV = mat([[1,1,0,1,0,1,0,0,1],[0,1,1,0,0,0,1,1,1]])
'''
nonzero函数把非零值的索引分别存储为行和列,如以下smstr的结果为
(matrix([[0, 0, 0, 0, 0, 0]], dtype=int64), # 表示非零值都在第0行
matrix([[0, 2, 3, 5, 6, 7]], dtype=int64)) # 表示各个非零值所在的列
'''
smstr = nonzero(matV[0]-matV[1])
print shape(smstr[0])[1] # 获取smstr第0行的数组然后计算出他的行列数,所取的列数即为汉明距离
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
7. 杰卡德相似系数(Jaccard Similarity Coefficient)
(1)杰卡德相似系数:两个集合A和B的交集元素在A、B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。
杰卡德相似系数是衡量两个集合的相似度的一种指标。
(2)杰卡德距离:与杰卡德相似系数相反的概念是杰卡德距离(Jaccard Distance),杰卡德距离可用如下公式表示:
杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
(3)杰卡德相似系数与杰卡德距离的应用。
可将杰卡德相似系数用在衡量样本的相似度上。
样本A与样本B是两个n维向量,而且所有维度的取值都是0或1.例如A(0111)和B(1011)。我们将样本堪称一个集合,1表示集合包含该元素,0表示集合不包含该元素。
p:样本A与B都是1的维度的个数。
q:样本A是1、样本B是0的维度的个数。
r:样本A是0、样本B是1的维度的个数。
s:样本A与B都是0的维度的个数。
那么样本A与B的杰卡德相似系数可以表示为:
这里p+q+r可理解为A与B的并集(集合中元素索引为1代表包含这个元素,即假如两个集合中这个元素的索引都为0即不包含这个元素),而p是A与B的交集的元素个数。
(4)Python实现杰卡德距离。
from numpy import *
import scipy.spatial.distance as dist # 导入SciPy距离公式
matV = mat([[1,1,0,1,0,1,0,0,1],[0,1,1,0,0,0,1,1,1]])
print "dist.jaccard:",dist.pdist(matV,'jaccard')
参考资料:
1、https://blog.youkuaiyun.com/tagst/article/details/50214669#4-%E5%88%87%E6%AF%94%E9%9B%AA%E5%A4%AB%E8%B7%9D%E7%A6%BBchebyshev-distance 2018.3.30