Collaborative Filtering Recommendations (協同過濾,簡稱CF) 是目前最流行的推薦方法,在研究界和工業界得到大量使用。但是,工業界真正使用的系統一般都不會只有CF推薦算法,Content-based Recommendations (CB,基於內容的推薦) 基本也會是其中的一部分。
0.基於內容的推薦(CB,Content-based Recommendations):
基於內容的推薦CB應該算是最早被使用的推薦方法吧,它根據用戶過去喜歡的產品(本文統稱為 item),為用戶推薦和他過去喜歡的產品相似的產品。例如,一個推薦飯店的系統可以依據某個用戶之前喜歡很多的烤肉店而為他推薦烤肉店。 CB最早主要是應用在信息檢索系統當中,所以很多信息檢索及信息過濾里的方法都能用於CB中。
CB的過程一般包括以下三步:
-Item Representation:為每個item抽取出一些特征(也就是item的content了)來表示此item;
-Profile Learning:利用一個用戶過去喜歡(及不喜歡)的item的特征數據,來學習出此用戶的喜好特征(profile);
-Recommendation Generation:通過比較上一步得到的用戶profile與候選item的特征,為此用戶推薦一組相關性最大的item。
協同過濾是一種通過收集來自許多用戶的偏好或品味信息(協作)來自動預測(過濾)關於用戶興趣的方法。協作過濾方法的基本假設是,如果一個人A在一個問題上與一個人B具有相同的意見,A更可能在一個隨機選擇的問題上有和B相同或相似的意見。請注意,這些預測是對特定用戶進行的,但使用從許多用戶收集的信息,“協同”就體現在這里。
常見的協同過濾推薦可以分為三類:
1.基於用戶的協同過濾(User CF,User based Collaborative Filtering):
基於用戶的協同過濾推薦算法先使用統計技術尋找與目標用戶有相同喜好的“鄰居”,然后根據目標用戶的鄰居的行為,向目標用戶進行推薦。基本原理就是利用用戶訪問行為的相似性來互相推薦用戶可能感興趣的資源。在一般應用中采用計算“k近鄰”,然后基於這K個鄰居的歷史偏好信息,為當前用戶進行推薦。
一般UserCF和ItemCF都是用上面的描述,其實真正實現的時候上面的描述只是第一步。真正實現的時候一般還是將問題分解為三步:計算用戶之間的相似度;根據用戶的相似度和用戶的歷史行為填補User-Item評分矩陣;根據評分矩陣進行推薦(選高分)。
具體的例子可以看ItemCF,UserCF只是換了表示的意義,比如公式(3)中N(i)和N(j)就變成了與用戶i,j交互過的物品數量。
相似度計算除了使用下面的公式(3),更多的使用Jaccard公式或pearson相似度以及余弦相似度、歐式距離:
$w_{ij}=\frac{\lvert N(i)\cap N(j) \rvert}{\lvert N(i)\cup N(j)\rvert}$ (1)
(2)
其中,相似度計算相關可以看:【知識】常見相似度度量
其中,KNN算法的整理可以看:待補充一篇筆記,KNN相關
2.基於物品的協同過濾(Item CF,Item based Collaborative Filtering):
算法核心思想:給用戶推薦那些和他們之前喜歡的物品相似的物品。
這里看起來是不是和基於內容的推薦的核心思想很相像?(ItemCF和CB的區別?)
確實很像,但是也是有很大差別的。比如,用戶A之前買過《數據挖掘導論》,該算法會根據此行為給你推薦《機器學習》。但是ItemCF算法並不利用物品的內容屬性計算物品之間的相似度,它主要通過分析用戶的行為記錄計算物品之間的相似度,然后根據相似度和用戶打分結合,算出用戶可能會對一些未接觸過的物品給出的打分,進而進行推薦。而CB則是利用物品的內容屬性計算物品之間的相似度,然后根據訓練得到的用戶的profile,找最相似的進行推薦。
基於物品的協同過濾算法主要分為三步:計算物品之間的相似度;根據物品的相似度和用戶的歷史行為填補User-Item評分矩陣;根據評分矩陣進行推薦(選高分)。具體如下:
$w_{ij}=\frac{\lvert N(i)\cap N(j) \rvert}{\sqrt{\lvert N(i)\rvert\lvert N(j)\rvert}}$ (3)
首先使用公式(3)計算物品之間的相似度。其中,|N(i)|是喜歡物品i的用戶數,|N(j)|是喜歡物品j的用戶數,|N(i)&N(j)|是同時喜歡物品i和物品j的用戶數。當物品ab完全一致(是同一個物品)時,那么N(a)和N(b)應該完全相等,那么wij就為1。即w越接近1,ab越相似。w為0時,說明從用戶物品交互角度來看,ab不相似。
如圖表示 用戶A對abd三個物品感興趣,以此類推。
那么物品a和b的相似度即為:$w_{ab}=\frac{1}{2*3}$
之后使用公式(4)預測用戶對與他沒有交互的物品的評分:
$p_{uj}=\sum_i w_{ji}r_{ui}$ (4)
其中pui表示用戶u對物品j的興趣(可能的打分),rui則表示用戶u對物品i已有的打分(explicit feedback中為打分,比如0-5分,implicit feedback中為有交互1,無交互0)。i可取自全集,也可挑選和j比較相似的幾個物品(設立相似度閾值進行判斷)。
下面是一個書中的例子,幫助理解ItemCF過程:
不止ItemCF,其實UserCF,CB的第二步,計算帶推薦物品的分數(填補User-Item矩陣)的方法都是如圖的方法。
3.基於模型的協同過濾
ItemCF和UserCF可以被歸為基於記憶的模型,即依賴簡單的相似性度量(比如余弦相似性、皮爾森相關系數等)來把相似的用戶或物品匹配起來。如果有一個矩陣,那么其中每一行是一個用戶,每一列代表一個物品,那么基於記憶的方法就是對這一矩陣的行或列使用相似性度量來獲得一個相似度值,進而推薦。
而與基於記憶的CF相對的,是基於模型的協同過濾。
基於模型的協同過濾作為目前最主流的協同過濾類型,其相關算法可以寫一本書了,當然我們這里主要是對其思想做有一個歸類概括。我們的問題是這樣的m個物品,m個用戶的數據,只有部分用戶和部分數據之間是有評分數據的,其它部分評分是空白,此時我們要用已有的部分稀疏數據來預測那些空白的物品和數據之間的評分關系,找到最高評分的物品推薦給用戶。
對於這個問題,用機器學習的思想來建模解決,主流的方法可以分為:用關聯算法,聚類算法,分類算法,回歸算法,矩陣分解,神經網絡,圖模型以及隱語義模型等來解決,我們就不具體展開了。
基於模型的協同過濾和基於記憶的協同過濾思想是一致的,都是想辦法對缺失的UI(user-item)矩陣進行填補,進而進行推薦。
基於記憶的CF利用簡單的相似性度量,以及線性加權組合進行填補。而基於模型的CF則利用各種更復雜的模型或方法,對UI矩陣進行填補,比如矩陣分解、隱向量的思想(隱語義模型)、SVD、SVD++等。
可以看出,我們平常時常接觸的隱語義模型、矩陣分解,都是基於模型的協同過濾算法。
參考資料:
https://www.cnblogs.com/chason95/articles/9453160.html
https://blog.csdn.net/nicajonh/article/details/79657317
https://blog.csdn.net/yeruby/article/details/44154009
https://blog.csdn.net/ygrx/article/details/15501679
https://blog.csdn.net/Flying_sfeng/article/details/55667846 (關於相似性度量的有些內容不太嚴謹)
http://www.cnblogs.com/pinard/p/6349233.html
主體已完成。2019.1.22