在做的一個項目中需要用到推薦演算法, 在網上查了一下. Beyond Search介紹了一個協同過濾演算法(Collaborative Filtering) : SlopeOne;和其它類似演算法相比, 它的最大優點在於演算法很簡單, 易於實現, 執行效率高, 同時推薦的準確性相對很高;
基本概念
SlopeOne的基本概念很簡單, 例子1, 使用者X, Y和A都對Item1打了分. 同時使用者X,Y還對Item2打了分, 使用者A對Item2可能會打多少分呢?
| User |
Rating to Item 1 |
Rating to Item 2 |
| X |
5 |
3 |
| Y |
4 |
3 |
| A |
4 |
? |
根據SlopeOne演算法, 應該是:4 - ((5-3) + (4-2))/2 = 2.5.
解釋一下.
使用者X對Item1的rating是5, 對Item2的rating是3, 那麼他可能認為Item2應該比Item1少兩分.
同時使用者Y認為Item2應該比Item1少1分.
據此我們知道所有對Item1和Item2都打了分的使用者認為Item2會比Item1平均少1.5分.
所以我們有理由推薦使用者A可能會對Item2打(4-1.5)=2.5分;
很簡單是不是? 找到對Item1和Item2都打過分的使用者, 算出rating差的平均值, 這樣我們就能推測出對Item1打過分的使用者A對Item2的可能Rating, 並據此向A使用者推薦新項目.
這裡我們能看出SlopeOne演算法的一個很大的優點, 在只有很少的資料時候也能得到一個相對準確的推薦, 這一點可以解決Cold Start的問題.
加權演算法
接下來我們看看加權演算法(Weighted SlopeOne). 如果有100個使用者對Item1和Item2都打過分, 有1000個使用者對Item3和Item2也打過分. 顯然這兩個rating差的權重是不一樣的. 因此我們的計算方法是
(100*(Rating 1 to 2) + 1000(Rating 3 to 2)) / (100 + 1000)
上面討論的是使用者只對項目的喜好程度打分.還有一種情況下使用者也可以對項目的厭惡程度打分. 這時可以使用雙極SlopeOne演算法(BI-Polar SlopeOne). 我還在研究這篇論文,搞懂了再寫吧, 呵呵;
參考資料
Slope One 演算法是由 Daniel Lemire 教授在 2005 年提出. 這裡可以找到論文原文(PDF);上面也列出了幾個參考實現. 現在有Python, Java和Erlang, 還沒有C#.
這篇: tutorial about how to implement Slope One in Python是一個很好的怎麼實現SlopeOne並使用它來推薦的例子. 但是現在好像不能訪問了 :-( 參考這篇文章, 我會在下一篇用C#代碼講解怎麼實現Weighted SlopeOne;