在我们的机器学习和数据挖掘过程中(如最近学习的聚类,以及knn算法),经常会用到一些距离算法,如欧式距离,曼哈顿距离等等,那么这些距离是怎么计算的呢,我们来了解一下:
欧式距离(Euclidean Distance)
欧式距离又称之为欧几里得度量,我们从小学开始所学的二维空间两点的距离便是欧式距离。
- 二维空间点a(x1,y1)与b(x2,y2)间的欧氏距离
在欧几里得平面中,两点距离相当于毕达哥拉斯定理
- 三维空间点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离:
- n维空间点a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的欧氏距离(两个n维向量):
代码实现:
#计算距离的函数 欧式距离 L2范式
def distanceEuclid(pointA,pointB):
return sqrt( sum( power(pointA-pointB,2 ) ) )
曼哈顿距离(Manhattan Distance)
曼哈顿距离也称为“城市街区距离”(City Block distance)。曼哈顿距离的命名原因是从规划为方型建筑区块的城市(如曼哈顿)间,最短的行车路径而来(忽略曼哈顿的单向车道以及只存在于3、14大道的斜向车道)。任何往东三区块、往北六区块的的路径一定最少要走九区块,没有其他捷径。
个人理解:两点所形成的直角三角形中,对应的斜边为欧式距离,而两条直角边之和为曼哈顿距离。
上图中红色代表曼哈顿距离,红色和蓝色为等价曼哈顿距离。绿色为欧式距离。
计算
- 在二维平面上,坐标(x1, y1)的i点与坐标(x2, y2)的j点的曼哈顿距离为:
d(i,j)=|X1-X2|+|Y1-Y2|
- n维空间点a(x11,x12,…,x1n)与b(x21,x22,…,x2n)的曼哈顿距离:
代码实现:
#计算距离的函数 曼哈顿距离 L1范数
def distanceManhattan(pointA,pointB):
return sum(abs(pointA-pointB))
切比雪夫距离 (Chebyshev Distance)
若将国际象棋棋盘放在二维直角坐标系中,格子的边长定义为1,坐标的x轴及y轴和棋盘方格平行,原点恰落在某一格的中心点,则王从一个位置走到其他位置需要的步数恰为二个位置的切比雪夫距离,因此切比雪夫距离也称为棋盘距离。
例如位置F7和位置E2的切比雪夫距离为5。
由此可以看出平面中两点的切比雪夫距离便是两点之间横纵坐标之差的绝对值的最大值。
- 二维平面两点a(x1,y1)与b(x2,y2)间的切比雪夫距离:
- n维空间点a(x11,x12,…,x1n)与b(x21,x22,…,x2n)的切比雪夫距离:
代码实现:
#切比雪夫距离
def distanceChebyshev(pointA,pointB):
return abs(pointA-pointB).max()
闵可夫斯基距离(Minkowski Distance)
定义
Minkowski距离通常用于p为1或2,其分别对应于曼哈顿距离和欧几里德距离。在p达到无穷大的极限情况下,我们得到Chebyshev距离
因此,根据变参数的不同,闵氏距离可以表示某一类/种的距离。
- 闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点。
- e.g. 二维样本(身高[单位:cm],体重[单位:kg]),现有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c的闵氏距离。但实际上身高的10cm并不能和体重的10kg划等号。
- 闵氏距离的缺点:
- (1)将各个分量的量纲(scale),也就是“单位”相同的看待了;
-
(2)未考虑各个分量的分布(期望,方差等)可能是不同的。
余弦距离(Cosine Distance)
余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。
在推荐算法我们会使用余弦相似度来计算两个用户之间的相似度,以此来给用户做推荐。
计算
大家想知道推导过程的,这篇文章通俗易懂,可以去看下:
用向量空间中的两个向量夹角的余弦值作为衡量两个个体间差异大小的度量,值越接近1,就说明夹角角度越接近0°,也就是两个向量越相似,就叫做余弦相似。
代码实现:
def cosSimilarity(pointA,pointB):
dist1 = 1 - dot(pointA,pointB.T)/(linalg.norm(pointA)*linalg.norm(pointB))
#linalg.norm默认第二范数
return dist1
Reference:
其余距离计算方式可参考机器学习——几种距离度量方法比较