欢迎关注,敬请点赞!
面试题:各种距离计算两个样本向量的相似性
my_list1 = [5, 0, 3, 0, 2, 0, 0, 2, 0, 0]
my_list2 = [3, 0, 2, 0, 1, 1, 0, 1, 0, 1]
分别利用曼哈顿距离、欧氏距离、切比雪夫距离、闵可夫斯基距离、余弦距离计算二者之间的相似性。
〇、范数
返回顶部
一、欧氏距离(Euclidean Distance)
返回顶部
1.定义:
欧氏距离(euclidean metric)(也称欧几里得度量,二范数)是通常采用的距离定义,指在m维空间中两个点之间的真实距离。在二维和三维空间中的欧氏距离就是两点之间的实际距离。
2.计算公式:
(1) 二维空间公式:
d(x,y)=(x2−x1)2+(y2−y1)2
(2) 三维空间的公式:
d(x,y)=(x2−x1)2+(y2−y1)2+(z2−z1)2
(3) n维空间的公式:
d(x,y)=i=1∑n(xi−yi)2
3.numpy代码实现:
import numpy as np
vector1 = np.array([5, 0, 3, 0, 2, 0, 0, 2, 0, 0])
vector2 = np.array([3, 0, 2, 0, 1, 1, 0, 1, 0, 1])
print('euclidean_dist =', np.linalg.norm(vector1 - vector2))
结果:
euclidean_dist = 3.0
4.适用的数据分析模型
欧氏距离能够体现个体数值特征的绝对差异,用于需要从维度的数值大小中体现差异的分析,如:
使用用户行为指标,分析用户价值的相似度或差异。
扫描二维码关注公众号,回复:
11157677 查看本文章
二、曼哈顿距离(Manhattan Distance)
返回顶部
红色、黄色、蓝色为曼哈顿距离
1.定义:
顾名思义,在曼哈顿街区,要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离(一范数)”,也称为“城市街区距离”(City Block distance)。
2.计算公式:
(1) 二维平面两点
a(x1,y1)与
b(x2,y2)间的曼哈顿距离:
d(a,b)=∣x1−y1∣+∣x2−y2∣
(2) n维空间点
a(x11,x12,…,x1n)与
b(x21,x22,…,x2n)的曼哈顿距离:
d(a,b)=i=1∑n∣x1i−x2i∣
3.numpy代码实现
import numpy as np
vector1 = np.array([5, 0, 3, 0, 2, 0, 0, 2, 0, 0])
vector2 = np.array([3, 0, 2, 0, 1, 1, 0, 1, 0, 1])
print('Manhattan_dist =', np.linalg.norm(vector1 - vector2, ord = 1))
结果:
Manhattan_dist = 7.0
三、切比雪夫距离 (Chebyshev Distance)
返回顶部
1.定义
切比雪夫距离(L∞无穷范数),又称棋盘距离。
国际象棋中,国王可以直行、横行、斜行。国王从格子
(x1,y1)走到格子
(x2,y2)最少需要多少步?你会发现最少步数总是
max(∣x2−x1∣,∣y2−y1∣) 步。
2.计算公式
(1) 二维平面两点
a(x1,y1)与
b(x2,y2)间的切比雪夫距离:
d(a,b)=max(∣x1−y1∣,∣x2−y2∣)
(2) n维空间点
a(x11,x12,…,x1n)与
b(x21,x22,…,x2n)的切比雪夫距离:
d(a,b)=imax(∣x1i−x2i∣)
(3) 公式的另一种等价形式是:可以使用放缩法和夹逼法则来证明。
d(a,b)=p→∞lim(i=1∑n∣xi−yi∣p)p1
3.numpy代码实现
import numpy as np
vector1 = np.array([5, 0, 3, 0, 2, 0, 0, 2, 0, 0])
vector2 = np.array([3, 0, 2, 0, 1, 1, 0, 1, 0, 1])
print('Chebyshev_dist =', np.linalg.norm(vector1 - vector2, ord = np.inf))
结果:
Chebyshev_dist = 2.0
4.适用的数据分析模型
如果把切比雪夫不等式用于高斯分布的数据集,会得到一个非常保守、粗糙的上下界。
四、 闵可夫斯基距离(Minkowski Distance)
返回顶部
1.定义和公式
闵可夫斯基距离(Minkowski Distance),是衡量数值点间距离的常见方法,假设数值点
P=(x1,x2,...,xn) and Q=(y1,y2,...,yn)∈Rn ,那么闵可夫斯基距离定义为:
(i=1∑n∣xi−yi∣p)p1
该距离最常用的p是2和1,前者是欧几里得距离,后者是曼哈顿距离。
假设在曼哈顿街区乘坐出租车从P点到Q点,白色方格表示高楼大厦,灰色表示街道:
绿色的斜线表示欧几里得距离,在现实中是不可能的。其他三条折线表示了曼哈顿距离,这三条折线的长度是相等的。
当 p 趋近于无穷大时,闵可夫斯基距离转化成切比雪夫距离(Chebyshev distance):
p→∞lim(i=1∑n∣xi−yi∣p)p1
2. numpy代码实现
import numpy as np
vector1 = np.array([5, 0, 3, 0, 2, 0, 0, 2, 0, 0])
vector2 = np.array([3, 0, 2, 0, 1, 1, 0, 1, 0, 1])
vect_size = np.size(vector1)
print('Minkowski_dist =',round(np.power(np.sum(np.power(np.abs(vector1 - vector2), vect_size)), 1 / vect_size), 3))
结果:
Minkowski_dist = 2.001
五、余弦距离(Cosine Distance)
返回顶部
1.定义
几何中,夹角余弦可用来衡量两个向量方向的差异;机器学习中,借用这一概念来衡量样本向量之间的差异。
2.计算公式
二维空间中向量
a(x1,y1)与向量
b(x2,y2)的夹角余弦公式:
cosθ=x12+y12
x22+y22
x1x2+y1y2
两个n维样本点
a(x11,x12,…,x1n)和
b(x21,x22,…,x2n)的夹角余弦为:
cosθ=∣a∣∣b∣a⋅b
即:
cosθ=i=1∑nx1i2
i=1∑nx2i2
i=1∑nx1ix2i
夹角余弦取值范围为[-1,1]。
余弦越大,表示两个向量的夹角越小;余弦越小,表示两向量的夹角越大。
当两个向量的方向重合时,余弦取最大值1;当两个向量的方向完全相反,余弦取最小值-1。
3.numpy代码实现
import numpy as np
vector1 = np.array([5, 0, 3, 0, 2, 0, 0, 2, 0, 0])
vector2 = np.array([3, 0, 2, 0, 1, 1, 0, 1, 0, 1])
cosθ = np.dot(vector1, vector2) / (np.linalg.norm(vector1) * np.linalg.norm(vector2))
print('cosθ =', round(cosθ, 2))
print('夹角为:', round(np.rad2deg(np.arccos(cosθ)), 1),'°')
结果:
cosθ = 0.94
夹角为: 20.7 °
总结
- 闵可夫斯基距离
(i=1∑n∣xi−yi∣p)p1 ,当p = 1时,为曼哈顿距离;当p = 2时,为欧几里得距离;当
p=∞ 时,为切比雪夫距离。式中,p越大,距离越小,切比雪夫距离最小。
欢迎关注,敬请点赞!
返回顶部