歐氏距離和余弦相似度

2021-06-16 12:06:32 字數 1572 閱讀 4046

兩者相同的地方,就是在機器學習中都可以用來計算相似度,但是兩者的含義有很大差別,以我的理解就是:

前者是看成座標系中兩個點,來計算兩點之間的距離;後者是看成座標系中兩個向量,來計算兩向量之間的夾角。前者因為是點,所以一般指位置上的差別,即距離;後者因為是向量,所以一般指方向上的差別,即所成夾角。

如下圖所示:

資料項a和b在座標圖中當做點時,兩者相似度為距離dist(a,b),可通過歐氏距離(也叫歐幾里得距離)公式計算:

當做向量時,兩者相似度為cosθ,可通過余弦公式計算:

假設||a||、||b||表示向量a、b的2範數,例如向量[1,2,3]的2範數為:

√(1²+2²+3²) = √14

numpy中提供了範數的計算工具:linalg.norm()

所以計算cosθ起來非常方便(假定a、b均為列向量):

num = float(a.t * b) #若為行向量則 a * b.t

denom = linalg.norm(a) * linalg.norm(b)

cos = num / denom #余弦值

sim = 0.5 + 0.5 * cos #歸一化

因為有了linalg.norm(),歐氏距離公式實現起來更為方便:

dist = linalg.norm(a - b)

sim = 1.0 / (1.0 + dist) #歸一化

關於歸一化:

因為余弦值的範圍是 [-1,+1] ,相似度計算時一般需要把值歸一化到 [0,1],一般通過如下方式:

sim = 0.5 + 0.5 * cosθ

若在歐氏距離公式中,取值範圍會很大,一般通過如下方式歸一化:

sim = 1 / (1 + dist(x,y))

說完了原理,簡單扯下實際意義,舉個栗子吧:

例如某t恤從100塊降到了50塊(a(100,50)),某西裝從1000塊降到了500塊(b(1000,500))

那麼t恤和西裝都是降價了50%,兩者的**變動趨勢一致,余弦相似度為最大值,即兩者有很高的變化趨勢相似度

但是從商品**本身的角度來說,兩者相差了好幾百塊的差距,歐氏距離較大,即兩者有較低的**相似度

-- eof --

歐氏距離和余弦相似度

參考自 歐氏距離與余弦相似度 歐氏距離和余弦相似度 在資料分析和資料探勘的過程中,我們經常需要知道個體間差異的大小,進而評價個體的相似性和類別。最常見的是資料分析中的相關分析,資料探勘中的分類和聚類演算法,如k最近鄰 knn 和k均值 k means 來衡量兩者的差異的方法,主要分為距離度量和相似度...

歐氏距離和余弦相似度

兩者相同的地方,就是在機器學習中都可以用來計算相似度,但是兩者的含義有很大差別,以我的理解就是 前者是看成座標系中兩個點,來計算兩點之間的距離 後者是看成座標系中兩個向量,來計算兩向量之間的夾角。前者因為是點,所以一般指位置上的差別,即距離 後者因為是向量,所以一般指方向上的差別,即所成夾角。如下圖...

相似度計算 歐氏距離 漢明距離 余弦相似度

計算影象間的相似性可以使用歐氏距離 余弦相似度 作為度量,前者強調點的思想,後者注重線的思想。歐氏距離 歐式距離 euclidean distance即n維空間中兩個點之間的實際距離。已知兩個點a a1,a2,an b b1,b2,b n a a1,a 2,an b b1,b 2,bn 則ab間的距...