推薦系統01--餘弦類似度

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

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

近鄰推薦顧名思義就是在地理位置上住得近。若是用戶有個鄰居,那麼社交軟件上把鄰居推薦給他在直觀上就很合理,固然,若是鄰居姓王的話,就不要推薦了。網絡

這裏說的近鄰,並不必定只是在三維空間下的地理位置的近鄰,在任意高維空間均可以找到近鄰,尤爲是當用戶和物品的特徵維度都很高時,要找到用戶隔壁的鄰居,就不是那麼直觀,須要選擇好用適合的類似度度量辦法。機器學習

近鄰推薦的核心就是類似度計算方法的選擇,因爲近鄰推薦並無採用最優化思路,因此效果一般取決於矩陣的量化方式和類似度的選擇。學習

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

推薦算法中的類似度門派,實際上有這麼一個潛在假設:若是兩個物體很類似,也就是距離很近,那麼這兩個物體就很容易產生同樣的動做。對象

若是兩篇新聞很類似,那麼他們很容易被同一我的前後點擊閱讀,若是兩個用戶很類似,那麼他們就很容易點擊同一個新聞。這種符合直覺的假設,大部分時候很奏效。博客

其實屬於另外一門派的推薦算法——機器學習中,也有不少算法在某種角度看作是類似度度量。it

例如,邏輯迴歸或者線性迴歸中,一邊是特徵向量,另外一邊是模型參數向量,二者的點積運算,就能夠看作是類似度計算,只不過其中的模型參數向量值並非人肉指定的,而是從數據中由優化算法自動總結出來的。微博

在近鄰推薦中,最經常使用的類似度是餘弦類似度。然而能夠選用的類似度並不僅是餘弦類似度,還有歐氏距離、皮爾遜相關度、自適應的餘弦類似度、局部敏感哈希等。使用場景各不相同,今天,我會分別一一介紹以下。變量

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

實數值; 布爾值,也就是 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)類似度
傑卡德類似度,是兩個集合的交集元素個數在並集中所佔的比例。因爲集合很是適用於布爾向量表示,因此傑卡德類似度簡直就是爲布爾值向量私人定作的。對應的計算方式是:

分子是兩個布爾向量作點積計算,獲得的就是交集元素個數; 分母是兩個布爾向量作或運算,再求元素和。
餘弦類似度適用於評分數據,傑卡德類似度適合用於隱式反饋數據。例如,使用用戶的收藏行爲,計算用戶之間的類似度,傑卡德類似度就適合來承擔這個任務。

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

這裏的場景是按照數據形式劃分的,按照向量維度取值是不是布爾值來看,傑卡德類似度就只適合布爾值向量,餘弦類似度彈性略大,適合兩種向量。歐式距離度量的是絕對差別,餘弦類似度度量的是方向差別,可是調整的餘弦類似度則能夠避免這個弱點。

如今留給你一個問題:若是在一個社交網絡中,要計算好友的類似度,你會選擇哪一種類似度來作?歡迎留言討論。

相關文章
相關標籤/搜索