推薦系統01–餘弦相似度

龍仔發表於2019-02-16

今天,我們來聊聊協同過濾中的相似度計算方法有哪些。

相似度的本質
推薦系統中,推薦演算法分為兩個門派,一個是機器學習派,另一個就是相似度門派。機器學習派是後起之秀,而相似度派則是泰山北斗,以致撐起來推薦系統的半壁江山。

近鄰推薦顧名思義就是在地理位置上住得近。如果使用者有個鄰居,那麼社交軟體上把鄰居推薦給他在直觀上就很合理,當然,如果鄰居姓王的話,就不要推薦了。

這裡說的近鄰,並不一定只是在三維空間下的地理位置的近鄰,在任意高維空間都可以找到近鄰,尤其是當使用者和物品的特徵維度都很高時,要找到使用者隔壁的鄰居,就不是那麼直觀,需要選擇好用適合的相似度度量辦法。

近鄰推薦的核心就是相似度計算方法的選擇,由於近鄰推薦並沒有採用最優化思路,所以效果通常取決於矩陣的量化方式和相似度的選擇。

相似度,與之配套的還有另一個概念就是距離,兩者都是用來量化兩個物體在高維空間中的親疏程度的,它們是硬幣的兩面。

推薦演算法中的相似度門派,實際上有這麼一個潛在假設:如果兩個物體很相似,也就是距離很近,那麼這兩個物體就很容易產生一樣的動作。

如果兩篇新聞很相似,那麼他們很容易被同一個人先後點選閱讀,如果兩個使用者很相似,那麼他們就很容易點選同一個新聞。這種符合直覺的假設,大部分時候很奏效。

其實屬於另一門派的推薦演算法——機器學習中,也有很多演算法在某種角度看做是相似度度量。

例如,邏輯迴歸或者線性迴歸中,一邊是特徵向量,另一邊是模型引數向量,兩者的點積運算,就可以看做是相似度計算,只不過其中的模型引數向量值並不是人肉指定的,而是從資料中由優化演算法自動總結出來的。

在近鄰推薦中,最常用的相似度是餘弦相似度。然而可以選用的相似度並不只是餘弦相似度,還有歐氏距離、皮爾遜相關度、自適應的餘弦相似度、區域性敏感雜湊等。使用場景各不相同,今天,我會分別一一介紹如下。

相似度的計算方法 資料分類
在真正開始巡視相似度計算方法前,我先給你把度量物件做個簡單分類。相似度計算物件是向量,或者叫做高維空間下的座標,一個意思。那表示這個向量的數值就有兩種:

實數值; 布林值,也就是 0 或者 1。 下面介紹的不同計算方法適用於不同的資料種類。

1 歐氏距離 歐氏距離,如名字所料,是一個歐式空間下度量距離的方法。兩個物體,都在同一個空間下表示為兩個點,假如叫做 p 和 q,分別都是
n 個座標。那麼歐式距離就是衡量這兩個點之間的距離,從 p 到 q 移動要經過的距離。歐式距離不適合布林向量之間。

這個公式就是,每一個座標上的取值相減,求平方和,最後輸出方根。

顯然,歐式距離得到的值是一個非負數,最大值是正無窮。通常相似度計算度量結果希望是 [-1,1] 或者 [0,1]
之間,所以歐式距離要麼無法直接使用到這個場景中,要麼需要經過二次轉化得到,我在文稿中放了一個最常用的轉化公式,你可以點選
距離加一後取倒數。這個公式能夠把範圍為 0 到正無窮的歐式距離轉換為 0 到 1 的相似度。

歐式距離度量的是空間中兩個點的絕對差異,適用於分析使用者能力模型之間的差異,比如消費能力、貢獻內容的能力等。

當然,雖然歐式距離計算兩個點的距離,實際上,點的座標表示和我們常說的向量表示是同一回事,希望這句話是廢話,你早已懂得。

2 餘弦相似度 大名鼎鼎的餘弦相似度,度量的是兩個向量之間的夾角,其實就是用夾角的餘弦值來度量,所以名字叫餘弦相似度。當兩個向量的夾角為 0
度時,餘弦值為 1,當夾角為 90 度時,餘弦值為 0,為 180 度時,餘弦值則為 -1。

餘弦相似度在度量文字相似度、使用者相似度、物品相似度的時候都較為常用;但是在這裡需要提醒你一點,餘弦相似度的特點:它與向量的長度無關。因為餘弦相似度計算需要對向量長度做歸一化:

經過向量長度歸一化後的相似度量方式,背後潛藏著這樣一種思想:兩個向量,只要方向一致,無論程度強弱,都可以視為“相似”。

這簡直就是:招聘人才時只看價值觀,不考核程式碼能力,只要肯幹,搬磚嘛,誰搬不是搬。這樣做錯不錯呢?很顯然,有非常大的合理性。

比如,我用 140 字的微博摘要了一篇 5000
字的部落格內容,兩者得到的文字向量可以認為方向一致,詞頻等程度不同,但是餘弦相似度仍然認為他們是相似的。

在協同過濾中,如果選擇餘弦相似度,某種程度上更加依賴兩個物品的共同評價使用者數,而不是使用者給予的評分多少。這就是由於餘弦相似度被向量長度歸一化後的結果。

餘弦相似度對絕對值大小不敏感這件事,在某些應用上仍然有些問題。

舉個小例子,使用者 A 對兩部電影評分分別是 1 分和 2 分,使用者 B 對同樣這兩部電影評分是 4 分和 5
分。用餘弦相似度計算出來,兩個使用者的相似度達到 0.98。這和實際直覺不符,使用者 A 明顯不喜歡這兩部電影。

針對這個問題,對餘弦相似度有個改進,改進的演算法叫做調整的餘弦相似度(Adjusted Cosine
Similarity)。調整的方法很簡單,就是先計算向量每個維度上的均值,然後每個向量在各個維度上都減去均值後,再計算餘弦相似度。

前面這個小例子,用調整的餘弦相似度計算得到的相似度是 -0.1,呈現出兩個使用者口味相反,和直覺相符。

3 皮爾遜相關度 皮爾遜相關度,實際上也是一種餘弦相似度,不過先對向量做了中心化,向量 p 和 q 各自減去向量的均值後,再計算餘弦相似度。

皮爾遜相關度計算結果範圍在 -1 到 1。-1 表示負相關,1 比表示正相關。皮爾遜相關度其實度量的是兩個隨機變數是不是在同增同減。

如果同時對兩個隨機變數取樣,當其中一個得到較大的值另一也較大,其中一個較小時另一個也較小時,這就是正相關,計算出來的相關度就接近
1,這種情況屬於沆瀣一氣,反之就接近 -1。

由於皮爾遜相關度度量的時兩個變數的變化趨勢是否一致,所以不適合用作計算布林值向量之間相關度,因為兩個布林向量也就是對應兩個 0-1
分佈的隨機變數,這樣的隨機變數變化只有有限的兩個取值,根本沒有“變化趨勢,高低起伏”這一說。

4 傑卡德(Jaccard)相似度
傑卡德相似度,是兩個集合的交集元素個數在並集中所佔的比例。由於集合非常適用於布林向量表示,所以傑卡德相似度簡直就是為布林值向量私人定做的。對應的計算方式是:

分子是兩個布林向量做點積計算,得到的就是交集元素個數; 分母是兩個布林向量做或運算,再求元素和。
餘弦相似度適用於評分資料,傑卡德相似度適合用於隱式反饋資料。例如,使用使用者的收藏行為,計算使用者之間的相似度,傑卡德相似度就適合來承擔這個任務。

總結 今天,我介紹了常用的幾種相似度計算方法,以及其各自的使用場景。

這裡的場景是按照資料形式劃分的,按照向量維度取值是否是布林值來看,傑卡德相似度就只適合布林值向量,餘弦相似度彈性略大,適合兩種向量。歐式距離度量的是絕對差異,餘弦相似度度量的是方向差異,但是調整的餘弦相似度則可以避免這個弱點。

現在留給你一個問題:如果在一個社交網路中,要計算好友的相似度,你會選擇哪種相似度來做?歡迎留言討論。

相關文章