数学工具包:numpy scipy 是必不可少的,一定要提安装好~
所列的距离公式列表和代码如下:
闵可夫斯基距离(Minkowski Distance)
欧氏距离(Euclidean Distance)
曼哈顿距离(Manhattan Distance)
切比雪夫距离(Chebyshev Distance)
夹角余弦(Cosine)
汉明距离(Hamming distance)
杰卡德相似系数(Jaccard similarity coefficient)
读者可根据自己需求有选择的学习。因使用矢量编程的方法,距离计算得到了较大的简化。
1. 闵可夫斯基距离(Minkowski Distance)
严格意义上,闵氏距离不是一种距离,而是一组距离的定义。
(1)闵氏距离的定义:
两个n维变量A(x11,x12,…,x1n)与 B(x21,x22,…,x2n)间的闵可夫斯基距离定义为:
2.欧氏距离(Euclidean Distance)
欧氏距离(L2范数)是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式(如图1.9)。
from numpy import * vector1 = mat([1,2,3]) vector2 = mat([4,5,6]) print sqrt((vector1-vector2)*((vector1-vector2).T)) 输出: [[ 5.19615242]]
3.曼哈顿距离(Manhattan Distance)
实际驾驶距离就是这个“曼哈顿距离”(L1范数)。而这也是曼哈顿距离名称的来源,曼哈顿距离也称为城市街区距离(City Block distance)
from numpy import * vector1 = mat([1,2,3]) vector2 = mat([4,5,6]) print sum(abs(vector1-vector2)) 输出: 9
4.切比雪夫距离(Chebyshev Distance)
国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走试试。你会发现最少步数总是max(| x2-x1| , |y2-y1| ) 步。有一种类似的一种距离度量方法叫切比雪夫距离(L∞范数)。
from numpy import * vector1 = mat([1,2,3]) vector2 = mat([4,7,5]) print abs(vector1-vector2).max() 输出:5
5. 夹角余弦(Cosine)
几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异
from numpy import * cosV12 = dot(vector1,vector2)/(linalg.norm(vector1)*linalg.norm(vector2)) print cosV12 输出:0.92966968
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]]) smstr = nonzero(matV[0]-matV[1]); print shape(smstr[0])[1] 输出: 6
(1) 杰卡德相似系数
两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。
杰卡德相似系数是衡量两个集合的相似度一种指标。
(2) 杰卡德距离
与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)
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') 输出:dist.jaccard: [ 0.75]
综上所述,我们常用的就是 Jaccard 杰卡德距离 和 余弦夹角.