在机器学习里,我们的运算一般都是基于向量的,一条用户具有100个特征,那么他对应的就是一个100维的向量,通过计算两个用户对应向量之间的距离值大小,有时候能反映出这两个用户的相似程度。这在后面的KNN算法和K-means算法中很明显。
设有两个n维变量和,则一些常用的距离公式定义如下:
1、曼哈顿距离
曼哈顿距离也称为城市街区距离,数学定义如下:
曼哈顿距离的Python实现:
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print sum(abs(vector1-vector2))
2、欧氏距离
欧氏距离其实就是L2范数,数学定义如下:
欧氏距离的Python实现:
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print sqrt((vector1-vector2)*(vector1-vector2).T)
3、闵可夫斯基距离
从严格意义上讲,闵可夫斯基距离不是一种距离,而是一组距离的定义:
实际上,当p=1时,就是曼哈顿距离;当p=2时,就是欧式距离。
4、切比雪夫距离
切比雪夫距离就是,即无穷范数,数学表达式如下:
切比雪夫距离额Python实现如下:
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print sqrt(abs(vector1-vector2).max)
5、夹角余弦
夹角余弦的取值范围为[-1,1],可以用来衡量两个向量方向的差异;夹角余弦越大,表示两个向量的夹角越小;当两个向量的方向重合时,夹角余弦取最大值1;当两个向量的方向完全相反时,夹角余弦取最小值-1。
机器学习中用这一概念来衡量样本向量之间的差异,其数学表达式如下:
夹角余弦的Python实现:
from numpy import *
vector1 = mat([1,2,3])
vector2 = mat([4,5,6])
print dot(vector1,vector2)/(linalg.norm(vector1)*linalg.norm(vector2))
6、汉明距离
汉明距离定义的是两个字符串中不相同位数的数目。
例如:字符串‘1111’与‘1001’之间的汉明距离为2。
信息编码中一般应使得编码间的汉明距离尽可能的小。
汉明距离的Python实现:
from numpy import *
matV = mat([1,1,1,1],[1,0,0,1])
smstr = nonzero(matV[0]-matV[1])
print smstr
7、杰卡德相似系数
两个集合A和B的交集元素在A和B的并集中所占的比例称为两个集合的杰卡德相似系数,用符号J(A,B)表示,数学表达式为:
杰卡德相似系数是衡量两个集合的相似度的一种指标。一般可以将其用在衡量样本的相似度上。
8、杰卡德距离
与杰卡德相似系数相反的概念是杰卡德距离,其定义式为:
杰卡德距离的Python实现:
from numpy import *
import scipy.spatial.distance as dist
matV = mat([1,1,1,1],[1,0,0,1])
print dist.pdist(matV,'jaccard')