推薦算法
目前主流的推薦算法主要包含內容關聯算法, 協同過濾算法。算法
內容關聯算法(Content-Based)
CB算法的原理是將一個item的基本屬性, 內容等信息提取出來, 抽成一個taglist, 爲每一個tag賦一個權重。服務器
剩下的事情就跟一個搜索引擎很是相似了, 將全部item對應的taglist作一下倒排轉換, 放到倒排索引服務器中存儲起來。markdown
當要對某一個item作相關推薦的時候, 將這個item對應的taglist拿出來拼成一個相似搜索系統中的query表達式, 再將召回的結果作一下排序做爲推薦結果輸出。cookie
當要對某個用戶作個性化推薦的時候, 將這個用戶最近喜歡/操做過的item列表拿出來, 將這些item的taglist拿出來並merge一下做爲用戶模型, 並將這個模型的taglist請求倒排索引服務, 將召回的結果做爲候選推薦給該用戶。網絡
該算法的好處是:post
- 不依賴於用戶行爲, 即不須要冷啓動的過程, 隨時到隨時都能推薦
- 能夠給出看起來比較合理的推薦解釋
- item被推薦的時效性能夠作得很高, 好比新聞類產品就須要用到該算法
該算法的壞處是:優化
- 須要理解item的內容, 對音頻/視頻等很差解析內容的就很差處理了
- 對於一次多義以及一義多詞等狀況處理起來比較複雜
- 容易出現同質化嚴重的問題, 缺少驚喜
協同過濾算法(collaborative filtering)
簡介
CF算法的原理是彙總全部<user,item>的行爲對, 利用集體智慧作推薦。其原理很像朋友推薦, 好比經過對用戶喜歡的item進行分析, 發現用戶A和用戶B很像(他們都喜歡差很少的東西), 用戶B喜歡了某個item, 而用戶A沒有喜歡, 那麼就把這個item推薦給用戶A。(User-Based CF)搜索引擎
固然, 還有另一個維度的協同推薦。即對比全部數據, 發現itemA和itemB很像(他們被差很少的人喜歡), 那麼就把用戶A喜歡的全部item, 將這些item相似的item列表拉出來, 做爲被推薦候選推薦給用戶A。(Item-Based CF)spa
如上說的都是個性化推薦, 若是是相關推薦, 就直接拿Item-Based CF
的中間結果就好啦。code
該算法的好處是:
- 能起到意想不到的推薦效果, 常常能推薦出來一些驚喜結果
- 進行有效的長尾item
- 只依賴用戶行爲, 不須要對內容進行深刻了解, 使用範圍廣
該算法的壞處是:
- 一開始須要大量的
<user,item>
行爲數據, 即須要大量冷啓動數據 - 很難給出合理的推薦解釋
原理
協同過濾算法具體實現的時候, 又分爲典型的兩類:
-
基於領域的協同過濾算法
這類算法的主要思想是利用
<user,item>
的打分矩陣, 利用統計信息計算用戶和用戶, item和item之間的類似度。而後再利用類似度排序, 最終得出推薦結果。常見的算法原理以下:
-
User-Based CF
先看公式:
該公式要計算用戶i和用戶j之間的類似度, I(ij)是表明用戶i和用戶j共同評價過的物品, R(i,x)表明用戶i對物品x的評分, R(i)頭上有一槓的表明用戶i全部評分的平均分, 之因此要減去平均分是由於有的用戶打分嚴有的鬆, 歸一化用戶打分避免相互影響。
該公式沒有考慮到熱門商品可能會被不少用戶所喜歡, 因此還能夠優化加一下權重, 這兒就不演示公式了。
在實際生產環境中, 常常用到另一個相似的算法
Slope One
, 該公式是計算評分誤差, 即將共同評價過的物品, 將各自的打分相減再求平均。 -
Item-Based CF
先看公式:
該公式跟User-Based CF是相似的, 就再也不重複解釋了。
這類算法會面臨兩個典型的問題:
- 矩陣稀疏問題
- 計算資源有限致使的擴展性問題
基於此, 專家學者們又提出了系列基於模型的協同過濾算法。
-
-
基於模型的協同過濾算法
基於模型的研究就多了, 常見的有:
- 基於矩陣分解和潛在語義的
- 基於貝葉斯網絡的
- 基於SVM的
這兒只簡單介紹一下基於矩陣分解的潛在語義模型的推薦算法。該算法首先將稀疏矩陣用均值填滿, 而後利用矩陣分解將其分解爲兩個矩陣相乘, 以下圖:
看一個實際的例子:
這個例子中, 原始矩陣中包含了網頁的Title和切詞後的term之間關係, 能夠類比爲推薦系統中的評分。而後用SVD作矩陣分解以後, 針對每一個term會對應一個3維向量, 針對每一個Title也會對應一個3維向量。
那麼接下來能夠作的事情就不少了, 若是要計算term和title的類似度, 只須要將這兩個3爲向量作內積獲得的分值便可;
還能夠將term和title都投影到這3維空間中, 而後利用各類聚類算法, 將用戶和item, item和item, 用戶和用戶的分類都給求出來。
該算法的核心是在於作矩陣分解, 在矩陣大了的狀況下計算量是很是誇張的, 在實際生產環境中會經常使用梯度遞歸降低方法來求得一個近似解。
-
組合推薦技術
其實從實踐中來看, 沒有哪一種推薦技術敢說本身沒有弊端, 每每一個好的推薦系統也不是隻用一種推薦技術就解決問題, 每每都是相互結合來彌補彼此的不足, 常見的組合方式以下:
- 混合推薦技術: 同時使用多種推薦技術再加權取最優;
- 切換推薦技術: 根據用戶場景使用不一樣的推薦技術;
- 特徵組合推薦技術: 將一種推薦技術的輸出做爲特徵放到另外一個推薦技術當中;
- 層疊推薦技術: 一個推薦模塊過程當中從另外一個推薦模塊中獲取結果用於本身產出結果;
Item-CF和User-CF選擇
- user和item數量分佈以及變化頻率
- 若是user數量遠遠大於item數量, 採用Item-CF效果會更好, 由於同一個item對應的打分會比較多, 並且計算量會相對較少
- 若是item數量遠遠大於user數量, 則採用User-CF效果會更好, 緣由同上
- 在實際生產環境中, 有可能由於用戶無登錄, 而cookie信息又極不穩定, 致使只能使用item-cf
- 若是用戶行爲變化頻率很慢(好比小說), 用User-CF結果會比較穩定
- 若是用戶行爲變化頻率很快(好比新聞, 音樂, 電影等), 用Item-CF結果會比較穩定
- 相關和驚喜的權衡
- item-based出的更偏相關結果, 出的可能都是看起來比較相似的結果
- user-based出的更有可能有驚喜, 由於看的是人與人的類似性, 推出來的結果可能更有驚喜
- 數據更新頻率和時效性要求
- 對於item更新時效性較高的產品, 好比新聞, 就沒法直接採用item-based的CF, 由於CF是須要批量計算的, 在計算結果出來以前新的item是沒法被推薦出來的, 致使數據時效性偏低;
- 可是能夠採用user-cf, 再記錄一個在線的用戶item行爲對, 就能夠根據用戶最近相似的用戶的行爲進行時效性item推薦;
- 對於像影視, 音樂之類的仍是能夠採用item-cf的;