距離產生美——機器學習常用距離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)=(x2x1)2+(y2y1)2d(x, y) = \sqrt{(x_2 - x_1) ^2 + (y_2 - y_1)^2}

(2) 三維空間的公式:d(x,y)=(x2x1)2+(y2y1)2+(z2z1)2d(x, y) = \sqrt{(x_2 - x_1) ^2 + (y_2 - y_1)^2 + (z_2 - z_1)^2}

(3) n維空間的公式:d(x,y)=i=1n(xiyi)2d(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.適用的數據分析模型

歐氏距離能夠體現個體數值特徵的絕對差異,用於需要從維度的數值大小中體現差異的分析,如:

使用用戶行爲指標,分析用戶價值的相似度或差異。

二、曼哈頓距離(Manhattan Distance)

返回頂部
曼哈頓距離
紅色、黃色、藍色爲曼哈頓距離

1.定義:

顧名思義,在曼哈頓街區,要從一個十字路口開車到另一個十字路口,駕駛距離顯然不是兩點間的直線距離。這個實際駕駛距離就是“曼哈頓距離(一範數)”,也稱爲“城市街區距離”(City Block distance)。

2.計算公式:

(1) 二維平面兩點a(x1,y1)a(x_1,y_1)b(x2,y2)b(x_2,y_2)間的曼哈頓距離:d(a,b)=x1y1+x2y2d_{(a, b)} = |x_1 - y_1| + |x_2 - y_2|

(2) n維空間點a(x11,x12,,x1n)a(x_{11},x_{12},…,x_{1n})b(x21,x22,,x2n)b(x_{21},x_{22},…,x_{2n})的曼哈頓距離:d(a,b)=i=1nx1ix2id_{(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∞無窮範數),又稱棋盤距離。

國際象棋中,國王可以直行、橫行、斜行。國王從格子(x1,y1)(x_1,y_1)走到格子(x2,y2)(x_2,y_2)最少需要多少步?你會發現最少步數總是max(x2x1,y2y1)max(| x_2 - x_1| , |y_2 - y_1| ) 步。

2.計算公式

(1) 二維平面兩點a(x1,y1)a(x_1,y_1)b(x2,y2)b(x_2,y_2)間的切比雪夫距離:d(a,b)=max(x1y1,x2y2)d_{(a, b)} = max(|x_1 - y_1|, |x_2 - y_2|)

(2) n維空間點a(x11,x12,,x1n)a(x_{11},x_{12},…,x_{1n})b(x21,x22,,x2n)b(x_{21},x_{22},…,x_{2n})的切比雪夫距離:d(a,b)=maxi(x1ix2i)d_{(a, b)} = \displaystyle \max_i(|x_{1i} - x_{2i}|)

(3) 公式的另一種等價形式是:可以使用放縮法和夾逼法則來證明。d(a,b)=limp(i=1nxiyip)1pd(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=(x1,x2,...,xn) and Q=(y1,y2,...,yn)RnP = (x_1, x_2, ..., x_n) \space and \space Q = (y_1, y_2, ..., y_n) \in R^n ,那麼閔可夫斯基距離定義爲:(i=1nxiyip)1p(\displaystyle \sum_{i=1}^n |x_i - y_i|^p)^{\frac {1}{p}}

該距離最常用的p是2和1,前者是歐幾里得距離,後者是曼哈頓距離。

假設在曼哈頓街區乘坐出租車從P點到Q點,白色方格表示高樓大廈,灰色表示街道:
閔可夫斯基距離
綠色的斜線表示歐幾里得距離,在現實中是不可能的。其他三條折線表示了曼哈頓距離,這三條折線的長度是相等的。
當 p 趨近於無窮大時,閔可夫斯基距離轉化成切比雪夫距離(Chebyshev distance):limp(i=1nxiyip)1p\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(x1,y1)a(x_1,y_1)與向量b(x2,y2)b(x_2,y_2)的夾角餘弦公式:cosθ=x1x2+y1y2x12+y12x22+y22cos\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(x11,x12,,x1n)a(x_{11},x_{12},…,x_{1n})b(x21,x22,,x2n)b(x_{21},x_{22},…,x_{2n})的夾角餘弦爲:cosθ=ababcos\theta = \frac {a \cdot b}{|a| |b|}

即:cosθ=i=1nx1ix2ii=1nx1i2i=1nx2i2cos\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=1nxiyip)1p(\displaystyle \sum_{i=1}^n |x_i - y_i|^p)^{\frac {1}{p}} ,當p = 1時,爲曼哈頓距離;當p = 2時,爲歐幾里得距離;當p=p = \infty 時,爲切比雪夫距離。式中,p越大,距離越小,切比雪夫距離最小

歡迎關注,敬請點贊!
返回頂部

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章