所列的距离公式列表和代码如下:
- 闵可夫斯基距离(Minkowski Distance)
- 欧氏距离(Euclidean Distance)
- 曼哈顿距离(Manhattan Distance)
- 切比雪夫距离(Chebyshev Distance)
- 夹角余弦(Cosine)
- 汉明距离(Hamming distance)
- 杰卡德相似系数(Jaccard similarity coefficient)
- 编辑距离(Edit Distance)
- 标准化欧氏距离 (Standardized Euclidean distance )
- 马氏距离(Mahalanobis Distance)
- 皮尔逊相关系数(Pearson correlation)
- 布雷柯蒂斯距离(Bray Curtis Distance)
读者可根据自己需求有选择的学习。因使用矢量编程的方法,距离计算得到了较大的简化。
1. 闵可夫斯基距离(Minkowski Distance)
严格意义上,闵氏距离不是一种距离,而是一组距离的定义。
(1)闵氏距离的定义:
两个n维变量A(x11,x12,…,x1n)与 B(x21,x22,…,x2n)间的闵可夫斯基距离定义为:
其中p是一个变参数。
当p=1时,就是曼哈顿距离
当p=2时,就是欧氏距离
当p→∞时,就是切比雪夫距离
根据变参数的不同,闵氏距离可以表示一类的距离。
(2)闵氏距离的缺点
闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点。
举个例子:二维样本(身高,体重),其中身高范围是150\~190,体重范围是50~60,有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。
简单说来,闵氏距离的缺点主要有两个: (1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。 (2)没有考虑各个分量的分布(期望,方差等)可能是不同的。
python中的实现:
# -*- coding:utf-8 -*- import numpy as np x=np.random.random(10) y=np.random.random(10) #方法一:根据公式求解,p=2 d1=np.sqrt(np.sum(np.square(x-y))) print('d1:',d1) #方法二:根据scipy库求解 from scipy.spatial.distance import pdist X=np.vstack([x,y]) d2=pdist(X,'minkowski',p=2)[0] print('d2:',d2)
2.欧氏距离(Euclidean Distance)
欧氏距离(L2范数)是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式(如图1.9)。
(4) python实现欧式距离公式的:
# -*- coding: utf-8 -*- from numpy import * vector1 = mat([1,2,3]) vector2 = mat([4,5,6]) print (sqrt((vector1-vector2)*((vector1-vector2).T))) import numpy as np x = np.random.random(10) y = np.random.random(10) # solution1 dist1 = np.linalg.norm(x - y) # solution2 dist2 = np.sqrt(np.sum(np.square(x - y))) print('x', x) print('y', y) print('dist1:', dist1) print('dist2:', dist2) # solution3 from scipy.spatial.distance import pdist X=np.vstack([x,y]) d2=pdist(X)[0] print('d2:',d2)
3.曼哈顿距离(Manhattan Distance)
从名字就可以猜出这种距离的计算方法了。想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”(L1范数)。而这也是曼哈顿距离名称的来源,曼哈顿距离也称为城市街区距离(City Block distance)(如图1.10)。
(3)python实现曼哈顿距离:
# -*- coding: utf-8 -*- from numpy import * vector1 = mat([1,2,3]) vector2 = mat([4,5,6]) print (sum(abs(vector1-vector2))) import numpy as np x=np.random.random(10) y=np.random.random(10) #方法一:根据公式求解 d1=np.sum(np.abs(x-y)) print('d1:',d1) #方法二:根据scipy库求解 from scipy.spatial.distance import pdist X=