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

7. 夾角餘弦(Cosine)html

       也能夠叫餘弦類似度。 幾何中夾角餘弦可用來衡量兩個向量方向的差別,機器學習中借用這一律念來衡量樣本向量之間的差別。
(1)在二維空間中向量A(x1,y1)與向量B(x2,y2)的夾角餘弦公式:

(2) 兩個n維樣本點a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夾角餘弦
       相似的,對於兩個n維樣本點a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可使用相似於夾角餘弦的概念來衡量它們間的類似程度。

  即:

       餘弦取值範圍爲[-1,1]。求得兩個向量的夾角,並得出夾角對應的餘弦值,此餘弦值就能夠用來表徵這兩個向量的類似性。夾角越小,趨近於0度,餘弦值越接近於1,它們的方向更加吻合,則越類似。當兩個向量的方向徹底相反夾角餘弦取最小值-1。當餘弦值爲0時,兩向量正交,夾角爲90度。所以能夠看出,餘弦類似度與向量的幅值無關,只與向量的方向相關。
python

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

兩個向量徹底相等時,餘弦值爲1,以下的代碼計算出來的d=1。dom

d=1-pdist([x,x],'cosine')

8. 皮爾遜相關係數(Pearson correlation)機器學習

(1) 皮爾遜相關係數的定義
學習

前面提到的餘弦類似度只與向量方向有關,但它會受到向量的平移影響,在夾角餘弦公式中若是將 x 平移到 x+1, 餘弦值就會改變。怎樣才能實現平移不變性?這就要用到皮爾遜相關係數(Pearson correlation),有時候也直接叫相關係數編碼

若是將夾角餘弦公式寫成:spa

表示向量x和向量y之間的夾角餘弦,則皮爾遜相關係數則可表示爲:3d

皮爾遜相關係數具備平移不變性和尺度不變性,計算出了兩個向量(維度)的相關性。code

 在python中的實現:orm

複製代碼
import numpy as np x=np.random.random(10) y=np.random.random(10) #方法一:根據公式求解 x_=x-np.mean(x) y_=y-np.mean(y) d1=np.dot(x_,y_)/(np.linalg.norm(x_)*np.linalg.norm(y_)) #方法二:根據numpy庫求解 X=np.vstack([x,y]) d2=np.corrcoef(X)[0][1]
複製代碼

相關係數是衡量隨機變量X與Y相關程度的一種方法,相關係數的取值範圍是[-1,1]。相關係數的絕對值越大,則代表X與Y相關度越高。當X與Y線性相關時,相關係數取值爲1(正線性相關)或-1(負線性相關)。

9. 漢明距離(Hamming distance)
(1)漢明距離的定義
       兩個等長字符串s1與s2之間的漢明距離定義爲將其中一個變爲另一個所須要做的最小替換次數。例如字符串「1111」與「1001」之間的漢明距離爲2。
       應用:信息編碼(爲了加強容錯性,應使得編碼間的最小漢明距離儘量大)。

 在python中的實現:

複製代碼
import numpy as np from scipy.spatial.distance import pdist x=np.random.random(10)>0.5 y=np.random.random(10)>0.5 x=np.asarray(x,np.int32) y=np.asarray(y,np.int32) #方法一:根據公式求解 d1=np.mean(x!=y) #方法二:根據scipy庫求解 X=np.vstack([x,y]) d2=pdist(X,'hamming')
複製代碼

10. 傑卡德類似係數(Jaccard similarity coefficient)
(1) 傑卡德類似係數
       兩個集合A和B的交集元素在A,B的並集中所佔的比例,稱爲兩個集合的傑卡德類似係數,用符號J(A,B)表示。

  傑卡德類似係數是衡量兩個集合的類似度一種指標。
(2) 傑卡德距離
       與傑卡德類似係數相反的概念是傑卡德距離(Jaccard distance)。傑卡德距離可用以下公式表示:

  傑卡德距離用兩個集合中不一樣元素佔全部元素的比例來衡量兩個集合的區分度。
(3) 傑卡德類似係數與傑卡德距離的應用
       可將傑卡德類似係數用在衡量樣本的類似度上。
  樣本A與樣本B是兩個n維向量,並且全部維度的取值都是0或1。例如:A(0111)和B(1011)。咱們將樣本當作是一個集合,1表示集合包含該元素,0表示集合不包含該元素。

 在python中的實現:

複製代碼
import numpy as np from scipy.spatial.distance import pdist x=np.random.random(10)>0.5 y=np.random.random(10)>0.5 x=np.asarray(x,np.int32) y=np.asarray(y,np.int32) #方法一:根據公式求解 up=np.double(np.bitwise_and((x != y),np.bitwise_or(x != 0, y != 0)).sum()) down=np.double(np.bitwise_or(x != 0, y != 0).sum()) d1=(up/down) #方法二:根據scipy庫求解 X=np.vstack([x,y]) d2=pdist(X,'jaccard')
複製代碼

11. 佈雷柯蒂斯距離(Bray Curtis Distance)

Bray Curtis距離主要用於生態學和環境科學,計算座標之間的距離。該距離取值在[0,1]之間。它也能夠用來計算樣本之間的差別。

 

樣本數據:

計算:

在python中的實現:

 

複製代碼
import numpy as np from scipy.spatial.distance import pdist x=np.array([11,0,7,8,0]) y=np.array([24,37,5,18,1]) #方法一:根據公式求解 up=np.sum(np.abs(y-x)) down=np.sum(x)+np.sum(y) d1=(up/down) #方法二:根據scipy庫求解 X=np.vstack([x,y]) d2=pdist(X,'braycurtis')
複製代碼
轉自:https://www.cnblogs.com/denny402/p/7028832.html
相關文章
相關標籤/搜索