天天看點

常見距離算法

機器學習中有很多的距離計算公式,用于計算資料和資料之間的距離,進而計算相似度或者其他。

1. 歐式距離(Euclidean Distance)

​ 歐式距離是最常見的距離度量方法。國小、國中、高中接觸到的兩個點在空間中的距離一般都是指歐式距離。

常見距離算法

舉例:

X=[[1,1],[2,2],[3,3],[4,4]];
經計算得:(2-1,3-1,4-1,3-2,4-2,4-3)
d = 1.4142    2.8284    4.2426    1.4142    2.8284    1.4142      

python求該距離:

testData=[1, 1]
testData2=[4, 4]
dist = np.linalg.norm(np.array(testData2) - np.array(testData))
print(dist)
print(round(dist, 2))
'''
4.242640687119285
4.24
'''      

2. 曼哈頓距離(Manhattan Distance)

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

常見距離算法
常見距離算法

舉例子:(2-1,3-1,4-1,3-2,4-2,4-3)

X=[[1,1],[2,2],[3,3],[4,4]];
經計算得:
d =   2     4     6     2     4     2      

python計算:

testData=[1, 1]
testData2=[4, 4.5]

op3=np.sum(np.abs(np.array(testData)-np.array(testData2)))
op4=np.linalg.norm(np.array(testData)-np.array(testData2),ord=1)
print(op3)
print(op4)
'''
6.5
6.5
'''      

3. 切比雪夫距離(Chebyshev Distance)

​ 國際象棋中,國王可以直行、橫行、斜行,是以國王走一步可以移動到相鄰8個方格中的任意一個。國王從格子(x1,y1)走到格子(x2,y2)最少需要多少步?這個距離就叫切比雪夫距離。

常見距離算法
常見距離算法

舉例:

X=[[1,1],[2,2],[3,3],[4,4]];
經計算得:
d =   1     2     3     1     2     1      

python計算:

import numpy as np

vector1 = np.array([1, 1])
vector2 = np.array([4, 4])
op5 = np.abs(vector1 - vector2).max()
op6 = np.linalg.norm(vector1 - vector2, ord=np.inf)
print(op5)
print(op6)
'''
3
3.0
'''      

4. 闵可夫斯基距離(Minkowski Distance)

該距離不是一種距離,而是一組距離的定義,是對多個距離度量工時的概括性的表述。

兩個n維變量a(x11,x12,…,x1n)與b(x21,x22,…,x2n)間的闵可夫斯基距離定義為:

常見距離算法

其中,P是一個可變參數

p=1是曼哈頓距離

P=2是歐式距離

P->無窮大時是切比學府距離

根據p的不同,闵氏距離可以表示某一類/種的距離。

小結: 上面四個距離存在的缺點:

(1). 二維樣本身高和體重機關不是,一個是cm、一個是kg,實際上10cm不等于10kg,但是上面計算是沒有考慮的。

(2). 未考慮各個分量的分布(期望,方差等)可能是不同的

5. 标準化歐式距離(Stangardized Euclidean Distance)

标準化歐式距離是針對歐式距離的缺點做的改進。 先将各個分量"标準化"到均值、方差等。

Sk表示各個次元的标準差

常見距離算法

如果将方差的倒數看成一個權重,也可稱之為權重歐氏距離(Weighted Euclidean distance)。

舉例:

X=[[1,1],[2,2],[3,3],[4,4]];(假設兩個分量的标準差分别為0.5和1)
經計算得:
d =   2.2361    4.4721    6.7082    2.2361    4.4721    2.2361      

6. 餘弦距離(Cosine Diatance)

幾何中,夾角餘弦可用來衡量兩個向量方向的差異;機器學習中,借用這一概念來衡量樣本向量之間的差異。

  • 二維空間中向量A(x1,y1)與向量B(x2,y2)的夾角餘弦公式:
常見距離算法
  • 兩個n維樣本點a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夾角餘弦為:
常見距離算法

也就是:

常見距離算法

夾角餘弦取值範圍為[-1,1]。餘弦越大表示兩個向量的夾角越小,餘弦越小表示兩向量的夾角越大。當兩個向量的方向重合時餘弦取最大值1,當兩個向量的方向完全相反餘弦取最小值-1。

舉例:

X=[[1,1],[1,2],[2,5],[1,-4]]
經計算得:
d =   0.9487    0.9191   -0.5145    0.9965   -0.7593   -0.8107      

python 計算:

import numpy as np

vector1 = np.array([1, 1])
vector2 = np.array([1, 2])
op7 = np.dot(vector1, vector2) / (np.linalg.norm(vector1) * (np.linalg.norm(vector2)))
print(op7)
'''
0.9486832980505138
'''      

此算法也可以用來計算相似度,餘弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫"餘弦相似性"。

7. 漢明距離(Hamming Distance)

兩個等長字元串s1與s2的漢明距離為:将其中一個變為另外一個所需要作的最小字元替換次數。例如字元串“1111”與“1001”之間的漢明距離為2。

python 計算:

import numpy as np

v1=np.array([1,1,0,1,0,1,0,0,1])
v2=np.array([0,1,1,0,0,0,1,1,1])
smstr=np.nonzero(v1-v2)
print(smstr) # 不為0 的元素的下标
sm= np.shape(smstr[0])[0]
print( sm )      

漢明重量:

是字元串相對于同樣長度的零字元串的漢明距離,也就是說,它是字元串中非零的元素個數:對于二進制字元串來說,就是 1 的個數,是以 11101 的漢明重量是 4。是以,如果向量空間中的元素a和b之間的漢明距離等于它們漢明重量的差a-b。

應用:漢明重量分析在包括資訊論、編碼理論、密碼學等領域都有應用。比如在資訊編碼過程中,為了增強容錯性,應使得編碼間的最小漢明距離盡可能大。但是,如果要比較兩個不同長度的字元串,不僅要進行替換,而且要進行插入與删除的運算,在這種場合下,通常使用更加複雜的編輯距離等算法。

舉例:

X=[[0,1,1],[1,1,2],[1,5,2]]
注:以下計算方式中,把2個向量之間的漢明距離定義為2個向量不同的分量所占的百分比。

經計算得:
d =   0.6667    1.0000    0.3333      

8. 傑卡德距離(Jaccard Distance)

通過交并集進行計算。兩個集合的交集在并集中所占的比例,稱為傑卡德相似系數。

常見距離算法

傑卡德距離(Jaccard Distance):與傑卡德相似系數相反,用兩個集合中不同元素占所有元素的比例來衡量兩個集合的區分度:

常見距離算法

舉例:

X=[[1,1,0][1,-1,0],[-1,1,0]]
注:以下計算中,把傑卡德距離定義為不同的次元的個數占“非全零次元”的比例
經計算得:
d =   0.5000    0.5000    1.0000      

總結:

  1. 歐式距離:通過距離平方值進行計算
  2. 曼哈頓距離:通過距離的絕對值求和進行計算
  3. 切比雪夫距離:次元的最大值進行計算
  4. 闵可夫斯基距離:一個距離的統稱

p=1是曼哈頓距離

P=2是歐式距離

P->無窮大時是切比雪夫距離

上面幾個距離将機關同等看待,計算過程不是很科學

  1. 标準化歐式距離:計算過程中添加了标準差
  2. 餘弦距離:通過cos思想完成
  3. 漢明距離:一個字元串變成另一個字元串需要經過幾個字母進行計算
  4. 傑卡德距離:通過交集并集計算