推薦召回--基於物品的協同過濾:ItemCF

火航發表於2022-01-21

1. 前言

說完基於使用者的協同過濾後,趁熱打鐵,我們來說說基於物品的協同過濾:“看了又看”,“買了又買”。

如果說協同過濾在推薦系統的召回策略中,佔據著非常重要的地位,那麼基於物品的協同過濾ItemCF,就是協同過濾的重心。

協同過濾演算法誕生於1998年,由亞馬遜首先提出,論文是:Item-Based Collaborative Filtering Recommendation
Algorithms。該論文被授予“時間檢驗獎”,理由就是:該論文深深的影響了實際應用。歷經二十多年,至今仍發光發熱,為推薦系統的演化,做出了不可磨滅的貢獻。

有的小夥伴可能會問:有了UserCF,還要什麼ItemCF?存在即合理,在總結了UserCF後,大家有沒有想過它的缺點呢?

  1. 使用者的數量很大,計算起來,很耗時
  2. 使用者的興趣和口味會隨著時間而變化
  3. 資料稀疏,使用者間的消費會受熱門物品的影響,很難發現使用者真正的興趣

而針對以上UserCF的缺點,ItemCF很好的解決了該問題。原因在於,構建物品-使用者的倒排表,先去計算物品間的相似度,然後對使用者已經消費過的物品進行規則過濾,那麼這樣的話,使用者的興趣就能很好的體現出來,此外,物品上通常比使用者基數少,在計算方面相應的會縮短計算時間。

接下來,我們就詳細的說說ItemCF。

2. 原理&計算&改進

跟使用者的協同過濾很像,物品的協同過濾,也需要使用者-物品的共現矩陣,區別於UserCF利用相似度計算方法去計算使用者間的相似度,ItemCF是計算物品間的相似度,然後根據物品的相似度,再去加權評分給使用者推薦。

當然,也可以直接對相似物品進行排序,直接把相似性高的物品,推薦給使用者,作為召回結果。具體根據效果來判定使用哪種方式。

同UserCF計算相似度的方法一樣,ItemCF的相似度計算也可以根據共現矩陣的特點去針對性的選擇餘弦相似度、傑卡德、皮爾遜等方法。此處,更新下變種的餘弦相似度計算方法:

\[w_{i,j} = \frac{|N(i)\cap N(j)|}{\sqrt{|N(i)||N(j)|}} \]

分母\(|N(i)|\)是瀏覽 i 的使用者數,分子\(|N(i)\cap N(j)|\)是一個月內同時瀏覽過 i 和 j 的使用者數。在計算完相似度後,可以直接使用:

\[pred(u,i)=\hat{r}_{ui}=\frac{\sum_{v\in U}sim(u,v)*r_{vi}}{\sum_{v\in U}|sim(u,v)|} \]

公式的核心思想如下:

要預測一個使用者 u 對一個物品 i 的分數,遍歷使用者 u 評分過的所有物品,假如一共有 m個,每一個物品和待計算物品 i 的相似度乘以使用者的評分,這樣加權求和後,除以所有這些相似度的總和,就得到了一個加權平均評分,作為使用者 u 對物品 i 的分數預測。

在實際的工作中,相似度的計算都是拿前一天的使用者資料離線計算完成後,直接儲存在redis或hbase中,供後續排序階段使用。

當然,相似度的計算方法有很多種,主要是根據業務實際情況來選擇,還有Slope One演算法,以及考慮序列跨度的相似度演算法。此外,常規的改進思路有:在評分體系中,可以用矩陣中物品的分數,減去物品的均值分數。這樣做的目的就是為了減少個人傾向所造成的影響。

3. 總結

關於協同過濾的總結到這裡就告一段路,後續會繼續總結其他召回通路,其實對於推薦召回側來說,主要的就是與業務相關策略的實現,而排序側主要就是演算法為主了。

在實際的工作中,sklearn通常作為除錯使用,如果資料量大,可以通過spark分散式計算框架來縮短計算量,但spark的底層一般不好修改,所以業界在大規模資料時,會以TensorFlow或Pytorch來訓練模型。

對於推薦系統來說,不管資料量多大,使用什麼平臺工具,其根本就是就是思想和理念,所以一定要把召回側、排序側的實現原理搞懂,剩下的工具,不需太過擔心,唯熟練爾。

最後,對於協同過濾來說,不管是UserCF還是ItemCF,無非就是三個過程:輸入端的資料處理,中間過程的相似度計算方法,輸出端的相似性詞典和推薦得分。另外,根據不同的特徵,選擇不同的方法,組合拼接就可以實現最基本的推薦召回,一點也不難。

繼續加油!

相關文章