機器學習中有很多的距離計算公式,用于計算資料和資料之間的距離,進而計算相似度或者其他。
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
總結:
- 歐式距離:通過距離平方值進行計算
- 曼哈頓距離:通過距離的絕對值求和進行計算
- 切比雪夫距離:次元的最大值進行計算
- 闵可夫斯基距離:一個距離的統稱
p=1是曼哈頓距離
P=2是歐式距離
P->無窮大時是切比雪夫距離
上面幾個距離将機關同等看待,計算過程不是很科學
- 标準化歐式距離:計算過程中添加了标準差
- 餘弦距離:通過cos思想完成
- 漢明距離:一個字元串變成另一個字元串需要經過幾個字母進行計算
- 傑卡德距離:通過交集并集計算