Slope One:簡(jiǎn)單高效的協(xié)同過(guò)濾算法發(fā)布日期: 2008-6-10 17:37:00 作者: 摘自來(lái)源: 博客園-首頁(yè)原創(chuàng)區(qū)
在做的一個(gè)項(xiàng)目中需要用到推薦算法, 在網(wǎng)上查了一下. Beyond Search介紹了一個(gè)協(xié)同過(guò)濾算法(Collaborative Filtering) : SlopeOne;和其它類(lèi)似算法相比, 它的最大優(yōu)點(diǎn)在于算法很簡(jiǎn)單, 易于實(shí)現(xiàn), 執(zhí)行效率高, 同時(shí)推薦的準(zhǔn)確性相對(duì)很高;
基本概念 SlopeOne的基本概念很簡(jiǎn)單, 例子1, 用戶X, Y和A都對(duì)Item1打了分. 同時(shí)用戶X,Y還對(duì)Item2打了分, 用戶A對(duì)Item2可能會(huì)打多少分呢?
根據(jù)SlopeOne算法, 應(yīng)該是:4 - ((5-3) + (4-2))/2 = 2.5. 解釋一下. 用戶X對(duì)Item1的rating是5, 對(duì)Item2的rating是3, 那么他可能認(rèn)為Item2應(yīng)該比Item1少兩分. 同時(shí)用戶Y認(rèn)為Item2應(yīng)該比Item1少1分. 據(jù)此我們知道所有對(duì)Item1和Item2都打了分的用戶認(rèn)為Item2會(huì)比Item1平均少1.5分. 所以我們有理由推薦用戶A可能會(huì)對(duì)Item2打(4-1.5)=2.5分; 很簡(jiǎn)單是不是? 找到對(duì)Item1和Item2都打過(guò)分的用戶, 算出rating差的平均值, 這樣我們就能推測(cè)出對(duì)Item1打過(guò)分的用戶A對(duì)Item2的可能Rating, 并據(jù)此向A用戶推薦新項(xiàng)目. 這里我們能看出SlopeOne算法的一個(gè)很大的優(yōu)點(diǎn), 在只有很少的數(shù)據(jù)時(shí)候也能得到一個(gè)相對(duì)準(zhǔn)確的推薦, 這一點(diǎn)可以解決Cold Start的問(wèn)題. 加權(quán)算法 接下來(lái)我們看看加權(quán)算法(Weighted SlopeOne). 如果有100個(gè)用戶對(duì)Item1和Item2都打過(guò)分, 有1000個(gè)用戶對(duì)Item3和Item2也打過(guò)分. 顯然這兩個(gè)rating差的權(quán)重是不一樣的. 因此我們的計(jì)算方法是 (100*(Rating 1 to 2) + 1000(Rating 3 to 2)) / (100 + 1000) 上面討論的是用戶只對(duì)項(xiàng)目的喜好程度打分.還有一種情況下用戶也可以對(duì)項(xiàng)目的厭惡程度打分. 這時(shí)可以使用雙極SlopeOne算法(BI-Polar SlopeOne). 我還在研究這篇論文,搞懂了再寫(xiě)吧, 呵呵; 參考資料 Slope One 算法是由 Daniel Lemire 教授在 2005 年提出. 這里可以找到論文原文(PDF);上面也列出了幾個(gè)參考實(shí)現(xiàn). 現(xiàn)在有Python, Java和Erlang, 還沒(méi)有C#. 這篇: tutorial about how to implement Slope One in Python是一個(gè)很好的怎么實(shí)現(xiàn)SlopeOne并使用它來(lái)推薦的例子. 但是現(xiàn)在好像不能訪問(wèn)了 :-( 參考這篇文章, 我會(huì)在下一篇用C#代碼講解怎么實(shí)現(xiàn)Weighted SlopeOne; |
|
|
來(lái)自: 石頭狗 > 《協(xié)同技術(shù)》