歐氏距離和余弦相似度的前世今緣

2021-10-10 23:53:18 字數 2502 閱讀 9945

前幾天在一場報告中和同事聊到了高維向量的距離度量,大家討論的點是:歐氏距離在高維下效果會非常差,那有沒有其他更有效的方法?

當時第一時間想到了余弦相似度,印象中在文字相似度(文字匹配)度量中就是用的余弦相似度。而且在深度學習中,也經常通過計算兩個向量的內積來表示相似程度。

然後同事說,余弦相似度只是歐距離的歸一化表示,本質沒有區別。當場懵逼:)

高維相似度量的討論結果不重要了,最後再說,先說歐氏和余弦的問題。

聞道有先後,能發現問題令人興奮;既然遇到了不懂的,慢慢搞懂就好了。

下面分享一下探索過程,來看看兩者的「前世今緣」

這部分是耳熟能詳的

歐幾里得度量(euclidean metric)(也稱歐氏距離)是乙個通常採用的距離定義,指在n維空間中兩個點之間的真實距離,或者向量的自然長度(即該點到原點的距離)。在二維和三維空間中的歐氏距離就是兩點之間的實際距離。

這個公式簡單,很合理,很符合直覺,實踐中被大量使用。

它還可以再推廣一下,然後被稱為閔可夫斯基距離

當p=2時,即為歐氏距離。(for fun,也許該叫畢氏距離,因為畢達哥拉斯定理 )

這個就不上圖了,因為太簡單了。

余弦相似度說著順口,余弦距離只是做了個減法轉化。

柿(式)子要從最簡單的捏起。

余弦:

定義域是整個實數集,值域是[-1, 1]。它是週期函式,其最小正週期為 2π。在自變數為2kπ (k 為整數)時,該函式有極大值1;在自變數為(2k+1)π時,該函式有極小值-1。余弦函式是偶函式,其影象關於y軸對稱。

余弦值:

兩個向量間的余弦值可以通過使用歐幾里得(是的,又有我)點積公式求出

余弦相似度:

ok,讓我們假設向量a和向量b的長度均大於0,上面的式子請挪動一下

so,余弦相似度就是兩個向量之間夾角的余弦值,取值範圍自然是[-1,1]。

對於文字匹配,屬性向量a和b通常是文件中的詞頻向量。余弦相似性,可以被看作是在比較過程中把檔案長度正規化的方法。

由於乙個詞的頻率(tf-idf權)不能為負數(都在第一象限),所以這兩個文件的余弦相似性範圍是[0,1]。並且,兩個詞的頻率向量之間的角度不能大於90°。

上個盜來的圖:(from: 

余弦距離:dist(a, b) = 1 - similarity

如前面說的,只是減法的轉換。為啥不直接取負,前面要用1減?

因為,這樣的取值範圍是[0,2],而直接取負,取值範圍還是[-1,1],我距離和你相似度一樣的取值範圍,豈不是很沒面子(距離非負性的要求)。

這部分是我之前不知道的

之前都沒想過歐氏距離和余弦距離能有什麼聯絡,因為物理意義上兩者感覺毫無關係(乙個是描述直線,乙個是描述角度)。

這時候就是數學展現它美麗的時候了,乙個複雜的問題,經過數學的洗禮,總是那麼優美動人。(感動到出了雙下巴:))

下面是大象裝冰箱的三步:

1. 歸一化:現在a,b的模長都經過了歸一化處理(ok, 余弦距離的分母沒了)

2. 一通推導:

過程改天補,先描述一下:

從左往右推到=》累計裡的括號展開=》平方項放一塊=》已歸一化,所以平方部分累加值是1=》高等數學(1+1=2)=》交叉乘剛好可以寫成內積(or余弦)=》提出係數=》ok

終於,這三生三世的緣分,單靠直覺是無法got到的了。我還以為兩者是乙個人呢,原來只是一對情侶:你雖然擁有了我的肉體,但靈魂上只是一半(1/2次方)

最後說高維向量距離度量的討論結果:

沒好辦法

降維?embedding?別鬧,你的問題是啥來。

歐氏距離和余弦相似度

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

歐氏距離和余弦相似度

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

歐氏距離和余弦相似度

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