距离产生美——机器学习常用距离numpy计算

欢迎关注,敬请点赞!
面试题:各种距离计算两个样本向量的相似性
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 ) = ( x 2 x 1 ) 2 + ( y 2 y 1 ) 2 d(x, y) = \sqrt{(x_2 - x_1) ^2 + (y_2 - y_1)^2}

(2) 三维空间的公式: d ( x , y ) = ( x 2 x 1 ) 2 + ( y 2 y 1 ) 2 + ( z 2 z 1 ) 2 d(x, y) = \sqrt{(x_2 - x_1) ^2 + (y_2 - y_1)^2 + (z_2 - z_1)^2}

(3) n维空间的公式: d ( x , y ) = i = 1 n ( x i y i ) 2 d(x, y) = \sqrt{\displaystyle \sum_{i=1}^n{(x_i - y_i) ^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))  # ord = 2

结果:

euclidean_dist = 3.0

4.适用的数据分析模型

欧氏距离能够体现个体数值特征的绝对差异,用于需要从维度的数值大小中体现差异的分析,如:

使用用户行为指标,分析用户价值的相似度或差异。

扫描二维码关注公众号,回复: 11157677 查看本文章

二、曼哈顿距离(Manhattan Distance)

返回顶部
曼哈顿距离
红色、黄色、蓝色为曼哈顿距离

1.定义:

顾名思义,在曼哈顿街区,要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离(一范数)”,也称为“城市街区距离”(City Block distance)。

2.计算公式:

(1) 二维平面两点 a ( x 1 , y 1 ) a(x_1,y_1) b ( x 2 , y 2 ) b(x_2,y_2) 间的曼哈顿距离: d ( a , b ) = x 1 y 1 + x 2 y 2 d_{(a, b)} = |x_1 - y_1| + |x_2 - y_2|

(2) n维空间点 a ( x 11 , x 12 , , x 1 n ) a(x_{11},x_{12},…,x_{1n}) b ( x 21 , x 22 , , x 2 n ) b(x_{21},x_{22},…,x_{2n}) 的曼哈顿距离: d ( a , b ) = i = 1 n x 1 i x 2 i d_{(a, b)} =\displaystyle \sum_{i=1}^n |x_{1i} - x_{2i}|

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∞无穷范数),又称棋盘距离。

国际象棋中,国王可以直行、横行、斜行。国王从格子 ( x 1 , y 1 ) (x_1,y_1) 走到格子 ( x 2 , y 2 ) (x_2,y_2) 最少需要多少步?你会发现最少步数总是 m a x ( x 2 x 1 , y 2 y 1 ) max(| x_2 - x_1| , |y_2 - y_1| ) 步。

2.计算公式

(1) 二维平面两点 a ( x 1 , y 1 ) a(x_1,y_1) b ( x 2 , y 2 ) b(x_2,y_2) 间的切比雪夫距离: d ( a , b ) = m a x ( x 1 y 1 , x 2 y 2 ) d_{(a, b)} = max(|x_1 - y_1|, |x_2 - y_2|)

(2) n维空间点 a ( x 11 , x 12 , , x 1 n ) a(x_{11},x_{12},…,x_{1n}) b ( x 21 , x 22 , , x 2 n ) b(x_{21},x_{22},…,x_{2n}) 的切比雪夫距离: d ( a , b ) = max i ( x 1 i x 2 i ) d_{(a, b)} = \displaystyle \max_i(|x_{1i} - x_{2i}|)

(3) 公式的另一种等价形式是:可以使用放缩法和夹逼法则来证明。 d ( a , b ) = lim p ( i = 1 n x i y i p ) 1 p d(a, b) = \displaystyle \lim_{p \to \infty} (\displaystyle \sum_{i=1}^n |x_i - y_i|^p)^{\frac {1}{p}}

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 = ( x 1 , x 2 , . . . , x n )   a n d   Q = ( y 1 , y 2 , . . . , y n ) R n P = (x_1, x_2, ..., x_n) \space and \space Q = (y_1, y_2, ..., y_n) \in R^n ,那么闵可夫斯基距离定义为: ( i = 1 n x i y i p ) 1 p (\displaystyle \sum_{i=1}^n |x_i - y_i|^p)^{\frac {1}{p}}

该距离最常用的p是2和1,前者是欧几里得距离,后者是曼哈顿距离。

假设在曼哈顿街区乘坐出租车从P点到Q点,白色方格表示高楼大厦,灰色表示街道:
闵可夫斯基距离
绿色的斜线表示欧几里得距离,在现实中是不可能的。其他三条折线表示了曼哈顿距离,这三条折线的长度是相等的。
当 p 趋近于无穷大时,闵可夫斯基距离转化成切比雪夫距离(Chebyshev distance): lim p ( i = 1 n x i y i p ) 1 p \displaystyle \lim_{p \to \infty} (\displaystyle \sum_{i=1}^n |x_i - y_i|^p)^{\frac {1}{p}}

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  # 当p = 10时,闵可夫斯基距离已经接近切比雪夫距离。

五、余弦距离(Cosine Distance)

返回顶部
余弦距离

1.定义

几何中,夹角余弦可用来衡量两个向量方向的差异;机器学习中,借用这一概念来衡量样本向量之间的差异。

2.计算公式

二维空间中向量 a ( x 1 , y 1 ) a(x_1,y_1) 与向量 b ( x 2 , y 2 ) b(x_2,y_2) 的夹角余弦公式: c o s θ = x 1 x 2 + y 1 y 2 x 1 2 + y 1 2 x 2 2 + y 2 2 cos\theta = \frac {x_1 x_2 + y_1y_2}{\sqrt{x_1^2 + y_1^2} \sqrt{x_2^2 + y_2^2}}

两个n维样本点 a ( x 11 , x 12 , , x 1 n ) a(x_{11},x_{12},…,x_{1n}) b ( x 21 , x 22 , , x 2 n ) b(x_{21},x_{22},…,x_{2n}) 的夹角余弦为: c o s θ = a b a b cos\theta = \frac {a \cdot b}{|a| |b|}

即: c o s θ = i = 1 n x 1 i x 2 i i = 1 n x 1 i 2 i = 1 n x 2 i 2 cos\theta = \frac {\displaystyle \sum_{i=1}^n x_{1i} x_{2i}}{\sqrt {\displaystyle \sum_{i=1}^n {x_{1i}^2}} \sqrt {\displaystyle \sum_{i=1}^n {x_{2i}^2}}}

夹角余弦取值范围为[-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 °

总结

  1. 闵可夫斯基距离 ( i = 1 n x i y i p ) 1 p (\displaystyle \sum_{i=1}^n |x_i - y_i|^p)^{\frac {1}{p}} ,当p = 1时,为曼哈顿距离;当p = 2时,为欧几里得距离;当 p = p = \infty 时,为切比雪夫距离。式中,p越大,距离越小,切比雪夫距离最小

欢迎关注,敬请点赞!
返回顶部

原创文章 43 获赞 14 访问量 2840

猜你喜欢

转载自blog.csdn.net/weixin_45221012/article/details/105533235