經(jīng)典推薦算法之 Slope one


title: 經(jīng)典推薦算法之 Slope one
date: 2017/5/16 15:29:24
tags:

  • 推薦系統(tǒng)
  • Machine Learning
    categories: 推薦系統(tǒng)

Slope One 是一系列應(yīng)用于協(xié)同過濾的算法的統(tǒng)稱换怖。由 Daniel Lemire和Anna Maclachlan于2005年發(fā)表的論文中提出放刨。 有爭議的是葵袭,該算法堪稱基于項(xiàng)目評價的non-trivial 協(xié)同過濾算法最簡潔的形式。該系列算法的簡潔特性使它們的實(shí)現(xiàn)簡單而高效个初,而且其精確度與其它復(fù)雜費(fèi)時的算法相比也不相上下乖寒。 該系列算法也被用來改進(jìn)其它算法。

協(xié)同過濾簡介及其主要優(yōu)缺點(diǎn)

協(xié)同過濾推薦(Collaborative Filtering recommendation)在信息過濾和信息系統(tǒng)中正迅速成為一項(xiàng)很受歡迎的技術(shù)院溺。與傳統(tǒng)的基于內(nèi)容過濾直接分析內(nèi)容進(jìn)行推薦不同宵统,協(xié)同過濾分析用戶興趣,在用戶群中找到指定用戶的相似(興趣)用戶,綜合這些相似用戶對某一信息的評價马澈,形成系統(tǒng)對該指定用戶對此信息的喜好程度預(yù)測。 與傳統(tǒng)文本過濾相比弄息,協(xié)同過濾有下列優(yōu)點(diǎn):

  1. 能夠過濾難以進(jìn)行機(jī)器自動基于內(nèi)容分析的信息。如藝術(shù)品摹量、音樂涤伐。
  2. 能夠基于一些復(fù)雜的,難以表達(dá)的概念(信息質(zhì)量缨称、品位)進(jìn)行過濾凝果。
  3. 推薦的新穎性。
    盡管協(xié)同過濾技術(shù)在個性化推薦系統(tǒng)中獲得了極大的成功睦尽,但隨著站點(diǎn)結(jié)構(gòu)器净、內(nèi)容的復(fù)雜度和用戶人數(shù)的不斷增加,協(xié)同過濾技術(shù)的一些缺點(diǎn)逐漸暴露出來当凡。 主要有以下三點(diǎn):
  4. 稀疏性(sparsity):在許多推薦系統(tǒng)中山害,每個用戶涉及的信息量相當(dāng)有限,在一些大的系統(tǒng)如亞馬遜網(wǎng)站中沿量,用戶最多不過就評估了上百萬本書的1%~2%浪慌。造成評估矩陣數(shù)據(jù)相當(dāng)稀疏,難以找到相似用戶集朴则,導(dǎo)致推薦效果大大降低权纤。
  5. 擴(kuò)展性(scalability):“最近鄰居”算法的計算量隨著用戶和項(xiàng)的增加而大大增加,對于上百萬之巨的數(shù)目乌妒,通常的算法將遭遇到嚴(yán)重的擴(kuò)展性問題汹想。
  6. 精確性(accuracy):通過尋找相近用戶來產(chǎn)生推薦集,在數(shù)量較大的情況下芥被,推薦的可信度隨之降低欧宜。

Item-based協(xié)同過濾 和 過擬合

當(dāng)可以對一些項(xiàng)目評分的時候,比如人們可以對一些東西給出1到5星的評價的時候拴魄,協(xié)同過濾意圖基于一個個體過去對某些項(xiàng)目的評分和(龐大的)由其他用戶的評價構(gòu)成的數(shù)據(jù)庫冗茸,來預(yù)測該用戶對未評價項(xiàng)目的評分。 例如: 如果一個人給披頭士的評分為5(總分5)的話匹中,我們能否預(yù)測他對席琳狄翁新專輯的評分呢夏漱?

這種情形下, item-based 協(xié)同過濾系統(tǒng)根據(jù)其它項(xiàng)目的評分來預(yù)測某項(xiàng)目的分值,一般方法為 線性回歸 (

). 于是顶捷,需要列出x2個線性回歸方程和2x2個回歸量挂绰,例如:當(dāng)有1000個項(xiàng)目時,需要列多達(dá)1,000,000個線性回歸方程, 以及多達(dá)2,000,000個回歸量葵蒂。除非我們只選擇某些用戶共同評價過的項(xiàng)目對交播,否則協(xié)同過濾會遇到過擬合問題。

另外一種更好的方法是使用更簡單一些的式子践付,比如


實(shí)驗(yàn)證明當(dāng)使用一半的回歸量的時候秦士,該式子(稱為Slope One)的表現(xiàn)有時優(yōu)于線性回歸方程。該簡化方法也不需要那么多存儲空間和延遲永高。

Item-based 協(xié)同過濾只是協(xié)同過濾的一種形式.其它還有像 user-based 協(xié)同過濾一樣研究用戶間的聯(lián)系的過濾系統(tǒng)隧土。但是,考慮到其他用戶數(shù)量龐大命爬,item-based協(xié)同過濾更可行一些曹傀。

電子商務(wù)中的Item-based協(xié)同過濾

人們并不總是能給出評分,當(dāng)用戶只提供二進(jìn)制數(shù)據(jù)(購買與否)的時候饲宛,就無法應(yīng)用Slope One 和其它基于評分的算法皆愉。 二進(jìn)制 item-based協(xié)同過濾應(yīng)用的例子之一就是Amazon的 item-to-item 專利算法,該算法中用二進(jìn)制向量表示用戶-項(xiàng)目購買關(guān)系的矩陣落萎,并計算二進(jìn)制向量間的cosine相關(guān)系數(shù)亥啦。

有人認(rèn)為Item-to-Item 算法甚至比Slope One 還簡單,例如:

在本例當(dāng)中练链,項(xiàng)目1和項(xiàng)目2間的cosine相關(guān)系數(shù)為:


項(xiàng)目1和項(xiàng)目3間的cosine相關(guān)系數(shù)為:

而項(xiàng)目2和項(xiàng)目3的cosine相關(guān)系數(shù)為:

于是翔脱,瀏覽項(xiàng)目1的顧客會被推薦買項(xiàng)目3(兩者相關(guān)系數(shù)最大),而瀏覽項(xiàng)目2的顧客會被推薦買項(xiàng)目3,瀏覽了項(xiàng)目3的會首先被推薦買項(xiàng)目1(再然后是項(xiàng)目2,因?yàn)?和3的相關(guān)系數(shù)小于1和3)。該模型只使用了每對項(xiàng)目間的一個參數(shù)(cosine相關(guān)系數(shù))來產(chǎn)生推薦媒鼓。因此届吁,如果有n個項(xiàng)目,則需要計算和存儲 n(n-1)/2 個cosine相關(guān)系數(shù)绿鸣。

Slope One 協(xié)同過濾

為了大大減少過適(過擬合)的發(fā)生疚沐,提升算法簡化實(shí)現(xiàn), Slope One 系列易實(shí)現(xiàn)的Item-based協(xié)同過濾算法被提了出來潮模。本質(zhì)上亮蛔,該方法運(yùn)用更簡單形式的回歸表達(dá)式

和單一的自由參數(shù),而不是一個項(xiàng)目評分和另一個項(xiàng)目評分間的線性回歸
擎厢。 該自由參數(shù)只不過就是兩個項(xiàng)目評分間的平均差值究流。甚至在某些實(shí)例當(dāng)中,它比線性回歸的方法更準(zhǔn)確[2]动遭,而且該算法只需要一半(甚至更少)的存儲量芬探。

例:

  1. User A 對 Item I 評分為1 對Item J.評分為1.5
  2. User B 對 Item I 評分為2.
  3. 你認(rèn)為 User B 會給 Item J 打幾分?
  4. Slope One 的答案是:2.5 (1.5-1+2=2.5).

舉個更實(shí)際的例子,考慮下表:


在本例中厘惦,項(xiàng)目2和1之間的平均評分差值為 (2+(-1))/2=0.5. 因此偷仿,item1的評分平均比item2高0.5。同樣的,項(xiàng)目3和1之間的平均評分差值為3酝静。因此节榜,如果我們試圖根據(jù)Lucy 對項(xiàng)目2的評分來預(yù)測她對項(xiàng)目1的評分的時候,我們可以得到 2+0.5 = 2.5别智。同樣全跨,如果我們想要根據(jù)她對項(xiàng)目3的評分來預(yù)測她對項(xiàng)目1的評分的話,我們得到 5+3=8.

如果一個用戶已經(jīng)評價了一些項(xiàng)目亿遂,可以這樣做出預(yù)測:簡單地把各個項(xiàng)目的預(yù)測通過加權(quán)平均值結(jié)合起來。當(dāng)用戶兩個項(xiàng)目都評價過的時候渺杉,權(quán)值就高蛇数。在上面的例子中,項(xiàng)目1和項(xiàng)目2都評價了的用戶數(shù)為2,項(xiàng)目1和項(xiàng)目3 都評價了的用戶數(shù)為1,因此權(quán)重分別為2和1. 我們可以這樣預(yù)測Lucy對項(xiàng)目1的評價:



于是是越,對“n”個項(xiàng)目耳舅,想要實(shí)現(xiàn) Slope One,只需要計算并存儲“n”對評分間的平均差值和評價數(shù)目即可倚评。

步驟

計算物品之間的評分差的均值浦徊,記為物品間的評分偏差(兩物品同時被評分)

根據(jù)物品間的評分偏差和用戶的歷史評分,預(yù)測用戶對未評分的物品的評分天梧。

將預(yù)測評分排序盔性,取topN對應(yīng)的物品推薦給用戶。

舉例

假設(shè)有100個人對物品A和物品B打分了呢岗,R(AB)表示這100個人對A和B打分的平均偏差;有1000個人對物品B和物品C打分了冕香, R(CB)表示這1000個人對C和B打分的平均偏差;

應(yīng)用Slope One的推薦系統(tǒng)

● hitflip DVD推薦系統(tǒng)
● How Happy
● inDiscover MP3推薦系統(tǒng)
● RACOFI Composer
● Value Investing News 股票新聞網(wǎng)站
● AllTheBests 購物推薦引擎

Python 實(shí)現(xiàn)

def loadData():
    items={'A':{1:5,2:3},
           'B':{1:3,2:4,3:2},
           'C':{1:2,3:5}}
    users={1:{'A':5,'B':3,'C':2},
           2:{'A':3,'B':4},
           3:{'B':2,'C':5}}
    return items,users

#***計算物品之間的評分差
#items:從物品角度后豫,考慮評分
#users:從用戶角度悉尾,考慮評分
def buildAverageDiffs(items,users,averages):
    #遍歷每條物品-用戶評分?jǐn)?shù)據(jù)
    for itemId in items:
        for otherItemId in items:
            average=0.0 #物品間的評分偏差均值
            userRatingPairCount=0 #兩件物品均評過分的用戶數(shù)
            if itemId!=otherItemId: #若無不同的物品項(xiàng)
                for userId in users: #遍歷用戶-物品評分?jǐn)?shù)
                    userRatings=users[userId] #每條數(shù)據(jù)為用戶對物品的評分
                    #當(dāng)前物品項(xiàng)在用戶的評分?jǐn)?shù)據(jù)中,且用戶也對其他物品由評分
                    if itemId in userRatings and otherItemId in userRatings:
                        #兩件物品均評過分的用戶數(shù)加1
                        userRatingPairCount+=1
                        #評分偏差為每項(xiàng)當(dāng)前物品評分-其他物品評分求和
                        average+=(userRatings[otherItemId]-userRatings[itemId])
                averages[(itemId,otherItemId)]=average/userRatingPairCount

#***預(yù)測評分
#users:用戶對物品的評分?jǐn)?shù)據(jù)
#items:物品由哪些用戶評分的數(shù)據(jù)
#averages:計算的評分偏差
#targetUserId:被推薦的用戶
#targetItemId:被推薦的物品
def suggestedRating(users,items,averages,targetUserId,targetItemId):
    runningRatingCount=0 #預(yù)測評分的分母
    weightedRatingTotal=0.0 #分子
    for i in users[targetUserId]:
        #物品i和物品targetItemId共同評分的用戶數(shù)
        ratingCount=userWhoRatedBoth(users,i,targetItemId)
        #分子
        weightedRatingTotal+=(users[targetUserId][i]-averages[(targetItemId,i)])\
        *ratingCount
        #分母
        runningRatingCount+=ratingCount
    #返回預(yù)測評分
    return weightedRatingTotal/runningRatingCount

# 物品itemId1與itemId2共同有多少用戶評分
def userWhoRatedBoth(users,itemId1,itemId2):
    count=0
    #用戶-物品評分?jǐn)?shù)據(jù)
    for userId in users:
        #用戶對物品itemId1與itemId2都評過分則計數(shù)加1
        if itemId1 in users[userId] and itemId2 in users[userId]:
            count+=1
    return count

if __name__=='__main__':
    items,users=loadData()
    averages={}
    #計算物品之間的評分差
    buildAverageDiffs(items,users,averages)
    #預(yù)測評分:用戶2對物品C的評分
    predictRating=suggestedRating(users,items,averages,2,'C')
    print 'Guess the user will rate the score :',predictRating


結(jié)果:用戶2對物品C的預(yù)測分值為 
Guess the user will rate the score : 3.33333333333

Slop one 增量更新

主要方法在于根據(jù)新的評分項(xiàng)挫酿,更新偏差表與共同評分項(xiàng)個數(shù)

維基百科
推薦算法之 slope one 算法
黃明波. 基于Slope One算法的增量音樂推薦系統(tǒng)的設(shè)計與實(shí)現(xiàn)[D].重慶大學(xué),2016

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末构眯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子早龟,更是在濱河造成了極大的恐慌惫霸,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拄衰,死亡現(xiàn)場離奇詭異它褪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)翘悉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門茫打,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事老赤÷盅螅” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵抬旺,是天一觀的道長弊予。 經(jīng)常有香客問我,道長开财,這世上最難降的妖魔是什么汉柒? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮责鳍,結(jié)果婚禮上碾褂,老公的妹妹穿的比我還像新娘。我一直安慰自己历葛,他們只是感情好正塌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恤溶,像睡著了一般乓诽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咒程,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天鸠天,我揣著相機(jī)與錄音,去河邊找鬼孵坚。 笑死粮宛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卖宠。 我是一名探鬼主播巍杈,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扛伍!你這毒婦竟也來了筷畦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤刺洒,失蹤者是張志新(化名)和其女友劉穎鳖宾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逆航,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鼎文,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了因俐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拇惋。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡周偎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撑帖,到底是詐尸還是另有隱情蓉坎,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布胡嘿,位于F島的核電站蛉艾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衷敌。R本人自食惡果不足惜软瞎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一恩静、第九天 我趴在偏房一處隱蔽的房頂上張望呵恢。 院中可真熱鬧郑叠,春花似錦星岗、人聲如沸侧啼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沟堡。三九已至侧但,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間航罗,已是汗流浹背禀横。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粥血,地道東北人柏锄。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像复亏,于是被迫代替她去往敵國和親趾娃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容