1. 闵可夫斯基距离
严格意义上讲,闵可夫斯基距离不是一种距离,而是一组距离的定义。
两个 n 维变量 A(x11,x12,···,x1n) 与 B(x21,x22,···,x2n) 间的闵可夫斯基距离的定义为:
d12=∑k=1n(x1k−x2k)pp
,其中p是一个变参数
- 当p=1 时,就是曼哈顿距离。
- 当p=2 时,就是欧式距离。
- 当 p→∞时,就是切比雪夫距离。
2. 欧氏距离(Euclidean Distance)
欧式距离(L2 范数)是最易于理解的一种距离计算方法,源自欧式空间中两点间的距离公式:dist(A,B)
(1)二维平面上两点 a(x1,y1) 与 b(x2,y2) 间的欧式距离:
d12=(x1−x2)2+(y1−y2)2
(2)三维空间间两点 A(x1,y1,z1) 与 B(x2,y2,z2) 间的欧式距离:
d12=(x1−x2)2+(y1−y2)2+(z1−z2)2
(3)两个 n 维向量 A(x11,x12,···,x1n) 与 B(x21,x22,···,x2n) 间的欧式距离:
d12=∑k=1n(x1k−x2k)2
表示为向量运算的形式:
d12=(A−B)(A−B)T
(4)Python 实现欧式距离
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print sqrt((vector1-vector2)*(vector-vector).T))
3. 曼哈顿距离(Manhattan Distance)
从名字就可以猜出这种距离的计算方法。想象你在曼哈顿要从一个十字路口来车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个 “曼哈顿距离”(L1 范数),而这也是曼哈顿距离名称的来源。曼哈顿距离也称为城市街区距离(City Block distance)
(1)二维平面两点 A(x1,y1) 与 B(x2,y2) 间的曼哈顿距离:
d12=|x1−x2|+|y1−y2|
(2)两个 n 维向量 A(x11,x12,···,x1n) 与 B(x21,x22,···,x2n) 间的曼哈顿距离:
d12=∑k=1n|x1k−x2k|
(3)Python 实现曼哈顿距离
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print sum(abs(vector1-vector2))
4. 切比雪夫距离(Chebyshev Distance)
国际象棋中,国王走一步能够移动到相邻的 8 个方格中的任意一个。那么国王从格子 (x1,y1) 走到格子 (x2,y2) 最少需要多少步?最少步数总是 max(|x2−x1|,|y2−y1|)步。有一种类似的距离度量方法叫作切比雪夫距离(L∞范数)。
(1)二维平面两点 A(x1,y1) 与 B(x2,y2) 间的切比雪夫距离:
d12=max(|x1−x2|,|y1−y2|)
(2)两个 n 维向量 A(x11,x12,···,x1n) 与 B(x21,x22,···,x2n) 间的切比雪夫距离:
d12=maxi(|x1i−x2i|)
这个公式的另一种等价形式是:
d12=limk→∞(∑i=1n|x1i−x2i|k)1/k
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) 的夹角余弦公式:
cosθ=x1x2+y1y2x12+y12x22+y22
(2)两个 n 维样本点 A(x11,x12,···,x1n) 与 B(x21,x22,···,x2n) 的夹角余弦:可以使用类似于夹角余弦的概念来衡量它们间的相似程度。
cosθ=AB|A||B|
即:
cosθ=∑k=1nx1kx2k∑k=1nx1k2∑k=1nx2k2
夹角余弦取值范围为[-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]
7. 杰卡德相似系数(Jaccard Similarity Coefficient)
(1)杰卡德相似系数:两个集合 A 和 B 的交集元素在 A、B 的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号 J(A,B) 表示。
J(A,B)=|A⋂B||A⋃B|
杰卡德相似系数是衡量两个集合的相似度的一种指标。
(2)杰卡德距离:与杰卡德相似系数相反的概念是杰卡德距离(Jaccard Distance),杰卡德距离可用如下公式表示:
Jδ(A,B)=1−J(A,B)=|A⋃B|−|A⋂B||A⋃B|
杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
(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 的杰卡德相似系数可以表示为:
J=pp+q+r
这里 p+q+r 可理解为 A 与 B 的并集(集合中元素索引为 1 代表包含这个元素,即假如两个集合中这个元素的索引都为 0 即不包含这个元素),而 p 是 A 与 B 的交集的元素个数。
(4)Python 实现杰卡德距离。
from numpy import *
import scipy.spatial.distance as dist
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')