在傳統基於內容的推薦係統中,根據商品特性的相似性來做推薦,例如:如果你購買了Machine Learning, Tom M.Mitchell這本書,係統會給你推薦The Elements of Statistical Learning, Trevor Hastie/Robert Tibshirani/Jerome Friedman。這兩本都是機器學習領域的經典書籍,係統基於機器學習這個共同的特性做了上述推薦。
協同過濾(Collaborative Filtering)旨在基於用戶行為或者說興趣的相似性進行推薦,簡單來說就是,如果用戶U1買了商品P1但沒有買P2,但是用戶U2買了商品P1且買了商品P2,那麽我們可以給用戶U1推薦商品P2。
常用的協同過濾算法有item-based和user-based,常用於具有user-item關係矩陣時的推薦問題。其中item-based推薦將商品表示成用戶是否購買的布爾向量,即將用戶作為商品的特征,如果要判斷買了item1是否要買item2,可以計算item1和item2的向量的相似度,計算方法有cosine、pearson相關係數、歐氏距離等。而user-based推薦將用戶表示成商品是否被購買的向量,即將商品作為用戶的特征,同樣計算向量相似度就可以做推薦了。
協同過濾的另外一種簡單而高效的方法是Slope One,這個算法適用於用戶對商品評分預測問題。先看一個非常簡單的例子:
User | Rating to Item 1 | Rating to Item 2 |
U1 | 9.5 | 4.5 |
U2 | 7.0 | 2.0 |
U3 | 8.0 | ? |
已知用戶U1/U2對兩個商品Item1和Item2的打分以及U3對Item1的打分,問U3對商品2的打分是?
Slope One 的答案非常簡介:8. 0 – ((9.5 -4.5) + (7.0 – 2.0)/2 = 3.0。文字解釋就是:先計算出其他對於對Item1和Item2打分差值的均值,再用U3對Item1打分減去這個均值。
為了擴展到更普適的情形,再來看另外一個略微複雜一點的例子:
User | Rating to Item 1 | Rating to Item 2 | Rating to Item 3 |
---|---|---|---|
John | 5.0 | 3.0 | 2.0 |
Mark | 3.0 | 4.0 | NULL |
Lucy | NULL | 2.0 | 5.5 |
問題是Lucy對Item1的評分是多少?
先看其他用戶對Item1跟其他Item打分差值:
John和Mark對於Item1和Item2評分差的均值為: ((5.0 – 3.0) + (3.0 – 4.0))/2 = 0.5,再看John對於Item1和Item3評分差的均值為:(5.0 – 2.0) = 3.0。
那麽Lucy對Item1的打分就是((2. 0 -(-0.5)) * 2 + (5.5 – (-3.0) * 1) / (2 + 1) = 13.5 / 3 = 4.5。文字解釋就是看其他用戶對Item1和其他Item打分差的均值,然後看自己第Item1和其他Item,用跟其他Item差值做加權平均。其中Item1和Item2打分差出現了2次,Item1和Item3打分差出現了1次。
總的來說,我們隻需要存儲商品對之間的評分插值以及評價次數即可,這對於處理商業推薦係統中的數據稀疏問題非常有用。
參考:
[1] http://zh.wikipedia.org/zh-cn/Slope_one