距離度量以及python實現(一)

先收藏,用到了在看html

1. 歐氏距離(Euclidean Distance)
       歐氏距離是最易於理解的一種距離計算方法,源自歐氏空間中兩點間的距離公式。
(1)二維平面上兩點a(x1,y1)與b(x2,y2)間的歐氏距離:

(2)三維空間兩點a(x1,y1,z1)與b(x2,y2,z2)間的歐氏距離:

(3)兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的歐氏距離:

(4)也能夠用表示成向量運算的形式:
python

python中的實現:app

方法一:dom

複製代碼
import numpy as np x=np.random.random(10) y=np.random.random(10) #方法一:根據公式求解 d1=np.sqrt(np.sum(np.square(x-y))) #方法二:根據scipy庫求解 from scipy.spatial.distance import pdist X=np.vstack([x,y]) d2=pdist(X)
複製代碼

2. 曼哈頓距離(Manhattan Distance)
       從名字就能夠猜出這種距離的計算方法了。想象你在曼哈頓要從一個十字路口開車到另一個十字路口,駕駛距離是兩點間的直線距離嗎?顯然不是,除非你能穿越大樓。實際駕駛距離就是這個「曼哈頓距離」。而這也是曼哈頓距離名稱的來源, 曼哈頓距離也稱爲城市街區距離(City Block distance)
(1)二維平面兩點a(x1,y1)與b(x2,y2)間的曼哈頓距離

(2)兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的曼哈頓距離
ide

python中的實現 :
idea

複製代碼
import numpy as np x=np.random.random(10) y=np.random.random(10) #方法一:根據公式求解 d1=np.sum(np.abs(x-y)) #方法二:根據scipy庫求解 from scipy.spatial.distance import pdist X=np.vstack([x,y]) d2=pdist(X,'cityblock')
複製代碼

3. 切比雪夫距離 ( Chebyshev Distance )
       國際象棋玩過麼?國王走一步可以移動到相鄰的8個方格中的任意一個。那麼國王從格子(x1,y1)走到格子(x2,y2)最少須要多少步?本身走走試試。你會發現最少步數老是max( | x2-x1 | , | y2-y1 | ) 步 。有一種相似的一種距離度量方法叫切比雪夫距離。
(1)二維平面兩點a(x1,y1)與b(x2,y2)間的切比雪夫距離spa

(2)兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的切比雪夫距離

  這個公式的另外一種等價形式是

       看不出兩個公式是等價的?提示一下:試試用放縮法和夾逼法則來證實。3d

在python中的實現:code

複製代碼
import numpy as np x=np.random.random(10) y=np.random.random(10) #方法一:根據公式求解 d1=np.max(np.abs(x-y)) #方法二:根據scipy庫求解 from scipy.spatial.distance import pdist X=np.vstack([x,y]) d2=pdist(X,'chebyshev')
複製代碼

4. 閔可夫斯基距離(Minkowski Distance)
閔氏距離不是一種距離,而是一組距離的定義。
(1) 閔氏距離的定義
       兩個n維變量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的閔可夫斯基距離定義爲:
htm

也可寫成


其中p是一個變參數。
當p=1時,就是曼哈頓距離
當p=2時,就是歐氏距離
當p→∞時,就是切比雪夫距離
       根據變參數的不一樣,閔氏距離能夠表示一類的距離。
(2)閔氏距離的缺點
  閔氏距離,包括曼哈頓距離、歐氏距離和切比雪夫距離都存在明顯的缺點。
  舉個例子:二維樣本(身高,體重),其中身高範圍是150~190,體重範圍是50~60,有三個樣本:a(180,50),b(190,50),c(180,60)。那麼a與b之間的閔氏距離(不管是曼哈頓距離、歐氏距離或切比雪夫距離)等於a與c之間的閔氏距離,可是身高的10cm真的等價於體重的10kg麼?所以用閔氏距離來衡量這些樣本間的類似度頗有問題。
       簡單說來,閔氏距離的缺點主要有兩個:(1)將各個份量的量綱(scale),也就是「單位」看成相同的看待了。(2)沒有考慮各個份量的分佈(指望,方差等)多是不一樣的。

python中的實現:

複製代碼
import numpy as np x=np.random.random(10) y=np.random.random(10) #方法一:根據公式求解,p=2 d1=np.sqrt(np.sum(np.square(x-y))) #方法二:根據scipy庫求解 from scipy.spatial.distance import pdist X=np.vstack([x,y]) d2=pdist(X,'minkowski',p=2)
複製代碼

5. 標準化歐氏距離 (Standardized Euclidean distance )
(1)標準歐氏距離的定義
  標準化歐氏距離是針對簡單歐氏距離的缺點而做的一種改進方案。標準歐氏距離的思路:既然數據各維份量的分佈不同,好吧!那我先將各個份量都「標準化」到均值、方差相等吧。均值和方差標準化到多少呢?這裏先複習點統計學知識吧,假設樣本集X的均值(mean)爲m,標準差(standard deviation)爲s,那麼X的「標準化變量」表示爲:

  標準化後的值 =  ( 標準化前的值  - 份量的均值 ) /份量的標準差
  通過簡單的推導就能夠獲得兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的標準化歐氏距離的公式:

  若是將方差的倒數當作是一個權重,這個公式能夠當作是一種加權歐氏距離(Weighted Euclidean distance)

python中的實現:

複製代碼
import numpy as np x=np.random.random(10) y=np.random.random(10) X=np.vstack([x,y]) #方法一:根據公式求解 sk=np.var(X,axis=0,ddof=1) d1=np.sqrt(((x - y) ** 2 /sk).sum()) #方法二:根據scipy庫求解 from scipy.spatial.distance import pdist d2=pdist(X,'seuclidean')
複製代碼

6. 馬氏距離(Mahalanobis Distance)
(1)馬氏距離定義
       有M個樣本向量X1~Xm,協方差矩陣記爲S,均值記爲向量μ,則其中樣本向量X到u的馬氏距離表示爲:

       而其中向量Xi與Xj之間的馬氏距離定義爲:

       若協方差矩陣是單位矩陣(各個樣本向量之間獨立同分布),則公式就成了:

       也就是歐氏距離了。
  若協方差矩陣是對角矩陣,公式變成了標準化歐氏距離。
python 中的實現:

複製代碼
import numpy as np x=np.random.random(10) y=np.random.random(10) #馬氏距離要求樣本數要大於維數,不然沒法求協方差矩陣 #此處進行轉置,表示10個樣本,每一個樣本2維 X=np.vstack([x,y]) XT=X.T #方法一:根據公式求解 S=np.cov(X) #兩個維度之間協方差矩陣 SI = np.linalg.inv(S) #協方差矩陣的逆矩陣 #馬氏距離計算兩個樣本之間的距離,此處共有10個樣本,兩兩組合,共有45個距離。 n=XT.shape[0] d1=[] for i in range(0,n): for j in range(i+1,n): delta=XT[i]-XT[j] d=np.sqrt(np.dot(np.dot(delta,SI),delta.T)) d1.append(d) #方法二:根據scipy庫求解 from scipy.spatial.distance import pdist d2=pdist(XT,'mahalanobis')
複製代碼

馬氏優缺點:

1)馬氏距離的計算是創建在整體樣本的基礎上的,這一點能夠從上述協方差矩陣的解釋中能夠得出,也就是說,若是拿一樣的兩個樣本,放入兩個不一樣的整體中,最後計算得出的兩個樣本間的馬氏距離一般是不相同的,除非這兩個整體的協方差矩陣碰巧相同;

2)在計算馬氏距離過程當中,要求整體樣本數大於樣本的維數,不然獲得的整體樣本協方差矩陣逆矩陣不存在,這種狀況下,用歐式距離計算便可。

3)還有一種狀況,知足了條件整體樣本數大於樣本的維數,可是協方差矩陣的逆矩陣仍然不存在,好比三個樣本點(3,4),(5,6)和(7,8),這種狀況是由於這三個樣本在其所處的二維空間平面內共線。這種狀況下,也採用歐式距離計算。

4)在實際應用中「整體樣本數大於樣本的維數」這個條件是很容易知足的,而全部樣本點出現3)中所描述的狀況是不多出現的,因此在絕大多數狀況下,馬氏距離是能夠順利計算的,可是馬氏距離的計算是不穩定的,不穩定的來源是協方差矩陣,這也是馬氏距離與歐式距離的最大差別之處。

優勢:它不受量綱的影響,兩點之間的馬氏距離與原始數據的測量單位無關;由標準化數據和中心化數據(即原始數據與均值之差)計算出的二點之間的馬氏距離相同。馬氏距離還能夠排除變量之間的相關性的干擾。缺點:它的缺點是誇大了變化微小的變量的做用。

參考:

http://www.cnblogs.com/daniel-D/p/3244718.html

http://www.cnblogs.com/likai198981/p/3167928.html

 

 

轉自:http://www.cnblogs.com/denny402/p/7027954.html

相關文章
相關標籤/搜索