标签: 数学基础
严格意义上讲,闵可夫斯基距离不是一种距离,而是一组距离的定义。
两个n维变量 A(x11,x12,⋅⋅⋅,x1n) 与 B(x21,x22,⋅⋅⋅,x2n) 间的闵可夫斯基距离的定义为:
欧式距离(L2范数)是最易于理解的一种距离计算方法,源自欧式空间中两点间的距离公式: dist(A,B)
(1)二维平面上两点 a(x1,y1) 与 b(x2,y2) 间的欧式距离:
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print sqrt((vector1-vector2)*(vector-vector).T))
从名字就可以猜出这种距离的计算方法。想象你在曼哈顿要从一个十字路口来车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”(L1范数),而这也是曼哈顿距离名称的来源。曼哈顿距离也称为城市街区距离(City Block distance)
(1)二维平面两点 A(x1,y1) 与 B(x2,y2) 间的曼哈顿距离:
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print sum(abs(vector1-vector2))
国际象棋中,国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子 (x1,y1) 走到格子 (x2,y2) 最少需要多少步?最少步数总是 max(|x2−x1|,|y2−y1|) 步。有一种类似的距离度量方法叫作切比雪夫距离( L∞ 范数)。
(1)二维平面两点 A(x1,y1) 与 B(x2,y2) 间的切比雪夫距离:
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,7,5])
print abs(vector1-vector2).max()
几何中的夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异。
(1)在二维空间中向量 A(x1,y1) 与向量 B(x2,y2) 的夹角余弦公式:
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
(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)杰卡德相似系数:两个集合 A 和 B 的交集元素在 A、B 的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号 J(A,B) 表示。
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')